R 中的日期与时间
一:储存格式
R中的三种日期储存格式分别为POSIXct,POSIXlt和DATE格式,三种格式之间可以使用as.POSIXct,as.POSIXlt,as.DATE进行互换。(如果不指定格式,as.date将会输出一个%y%m%d形式的的date)
注意,Sys.time返回的是一个以POSIXct形式的系统时间。在加载完lubridate之后,可以使用today()函数,得到一个date形式的系统日期。
二:格式的转换
外界输入的字符串需要被解析成标准格式后,R才能对其使用时间函数。
使用strptime()函数进行标准化,得到一个POSIXlt形式的输出。
Strptime()的一般形式是:
Strptime(时间字符串,”由%- 等组成的格式”,tz时区设置)
相反的过程称之为格式化日期,就是把标准化的日期输出成某个格式的日期。
使用strftime()函数进行格式化,strftime()的一般形式是:
Strftime(标准化的日期,”自由定义的格式”,时区设置),这个“自由定义的格式”有多自由呢?他可以以一个句子的形式出现,比如“It is %Y-%m-%d,%H:%M:%S”,也可以使用其他输出形式,比如%I是十二小时制的小时数,%p是am,pm,%A是星期几,%B是月份。
三:时区的设置
Strftime()输出的时候不能对POSIXlt形式的的日期改变时区,对其他形式的是可以的。
设置时区有三种方式:
1, tz=America/Los_Angeles
2, tz=”UTC”或者”GMT”或者“EST”
3, tz=”UTC+2:30”
四:日期、时间的运算
1, POSIXct +numeric,numeric代表的是秒;同理,POSIXlt +numeric中,numeirc代表的也是秒,但DATE+numeric,numeric代表的是天数。
2, 两个日期相减代表两个日期之间的差额。相加则没有什么意义。
可以直接相减,也可以用difftime()函数来实现
Difftime(被减数,减数,units=months/weeks···secs),
3, Seq函数可以用来生成时间序列,它的形式是:
Seq(开始日期,结束日期,by=步长)
4, 其他函数如repeat、mean、round、cut、summary也能对时间操作,效果不一,目前我还没有试过
五:lubridate包
1, ymd家族函数:ymd,mdy,dym,ymd_h,ymd_hms等等
这些函数的作用就是标准化,用以取代strptime函数,以ymd函数为例,ymd(字符串),只要字符串中的日期顺序遵循年月日(也就是ymd),不管这些字符串日期有多“脏”,比如说“2015//12,03”,那么最终都会输出一个年月日的标准化时间“2015-12-03”,输出的格式是date,(如果是ymd_hms就是输出POSIXct形式的日期了)
2, stamp函数用于取代strftime:
如果说strftime还需要用%D%Y之类的火星文制定输出的话,那么stamp可以自动识别输入语句的形式形成一个模板:
F <- stamp(“it is July 2013-3-21”),它自动识别为“it isJuly %Y-%m-%d”的模板函数,
F(某个日期)的输出结果就是按照上面的模板输出的
3, 时间范围的处理
A, duration类函数,d*(比如说dyears,ddays)
dyears(4),生成一个数字,是4*365*86400,它严格假设一年是365天,一天是86400秒,不考虑闰年,闰秒的情况
dyears(1:10)可以生成一个向量
B, period类函数,比如说years(),days()
这是按照日历来计数的,有时一年是365天,那么years(1)就是365天,若是闰年,years(1)就是366天了
C, interval类的函数,计算从开始到结束的一段间隔时间长度
使用new_interval(开始时间,结束时间)来创建一段interval
注:
a:new_duration(),new_period()函数可以创建一些更加复杂的duration类和period类函数,这一点目前我也不知道
b:as,period()可以把其他类型的日期转换为period,也有as.duration函数和as.interval函数可以用,其中as.interval()和new_interval()效果一样。
D, 日期 %--% 日期 这种形式可以迅速创建一个interval,
同时,日期 %within% interval 这种形式可以判断该日期是否在这个Interval之内
4, lubridate中对时区的处理
A, with_tz(日期,tz设置)可以直接改变日期的时区,不需要转换日期格式,你如果是用strftime函数的话还得先把日期转换为POSIXlt形式的,太麻烦了
B, force_tz()用于更新不正确的时区,目前我也不知道这是啥意思
C, olsen_time_zones()用于获得具有olson风格的时区列表
olson_time_zones(“longitude”)得到按照经线顺序排列的时区列表,是按照大洲/城市的形式出现的
啥是olson风格,大概是按照大洲/代表城市的就是olson风格,目前代表中国的城市是,哈尔滨(长白时区),上海(中原时区),重庆(陇蜀时区),乌鲁木齐(新藏时区),喀什(昆仑时区)
D, floor_date(日期,unit) unit比如说是年月日什么的,
floor_date(2014-3-12,”year”)将会得到2014-01-01,就是这一日期按照年计算的最低值
ceiling_date()正好相反,ceiling(2014-03-14,”year”)将会得到2015-01-01