R的数据类型与相应运算
(学习资料参考北京大学李东风老师《R语言教程》)
9 R日期时间
9.1 R日期和日期时间类型
R日期可以保存为Date类型, 一般用整数保存,数值为从1970-1-1经过的天数。
R中用一种叫做 POSIXct 和 POSIXlt 的特殊数据类型保存日期和时间, 可以仅包含日期部分,也可以同时有日期和时间。 技术上,POSIXct把日期时间保存为从1970年1月1日零时到该日期时间的时间间隔秒数, 所以数据框中需要保存日期时用POSIXct比较合适, 需要显示时再转换成字符串形式;POSIXlt把日期时间保存为一个包含年、月、日、星期、时、分、秒等成分的列表, 所以求这些成分可以从POSIXlt格式日期的列表变量中获得。 日期时间会涉及到所在时区、夏时制等问题, 比较复杂。
基础的R用 as.Date()
、as.POSIXct()
等函数生成日期型和日期时间型, R扩展包lubridate提供了多个方便函数, 可以更容易地生成、转换、管理日期型和日期时间型数据。
library(lubridate)
ps.这步很重要,一定要先导入包才能使用日期
9.2 从字符串生成日期数据
- 函数lubridate::today()返回当前日期:
today()
结果如下:
- 函数lubridate::now()返回当前日期时间:
now()
结果如下:
(结果显示中出现的CST是时区, 这里使用了操作系统提供的当前时区。 CST不是一个含义清晰的时区, 在不同国家对应不同的时区, 在中国代表中国标准时间(北京时间)。)
- 用lubridate::ymd(), lubridate::mdy(), lubridate::dmy()将字符型向量转换为日期型向量,如:
ymd(c("1998-3-10", "2018-01-17", "18-1-17"))
mdy(c("3-10-1998", "01-17-2018"))
dmy(c("10-3-1998", "17-01-2018"))
结果如下:
- 在年号只有两位数字时,默认对应到1969-2068范围
lubridate::make_date(year, month, day)
可以从三个数值构成日期向量。 如:
make_date(1998, 3, 10)
- lubridate包的
ymd
、mdy
、dmy
等函数添加hms
、hm
、h
等后缀, 可以用于将字符串转换成日期时间。 如:
ymd_hms("1998-03-16 13:15:45")
结果如下,这里的UTC是是时区, UTC是协调世界时(Universal Time Coordinated)英文缩写, 是由国际无线电咨询委员会规定和推荐, 并由国际时间局(BIH)负责保持的以秒为基础的时间标度。 UTC相当于本初子午线(即经度0度)上的平均太阳时, 过去曾用格林威治平均时(GMT)来表示. 北京时间比UTC时间早8小时, 以1999年1月1日0000UTC为例, UTC时间是零点, 北京时间为1999年1月1日早上8点整。
7. 在 Date()
、as.DateTime()
、ymd()
等函数中, 可以用 tz=
指定时区, 比如北京时间可指定为 tz="Etc/GMT+8"
或 tz="Asia/Shanghai"
。
8. lubridate::make_datetime(year, month, day, hour, min, sec)
可以从最多六个数值组成日期时间, 其中时分秒缺省值都是0。 如:
make_datetime(1998, 3, 16, 13, 15, 45.2)
- 用
lubridate::as_date()
可以将日期时间型转换为日期型,如:
as_date(as.POSIXct("1998-03-16 13:15:45"))
(这时就会忽略后面的时间,输出的是日期)
- 用
lubridate::as_datetime()
`可以将日期型数据转换为日期时间型,如:
as_datetime(as.Date("1998-03-16"))
9.3 日期显示格式
- 用
as.character()
函数把日期型数据转换为字符型, 如:
x <- as.POSIXct(c('1998-03-16', '2015-11-22'))
as.character(