R语言——日期和时间2

参考资料:学习R

1、日期和时间的算术运算

        R支持3个日期与时间基类的算术运算。将数字与POSIX日期相加,会议秒为单位增加时间。将数字与Date相加会以天数为单位

now_ct<-Sys.time()
print(now_ct)
now_ct+68400
now_lt<-as.POSIXlt(now_ct)
print(now_lt)
now_lt+68400

        把两个日期加起来其实没有多大意义,而且会抛出一个错误。但R是支持减法操作的,R会计算两个日期之间的差值。这种行为对于所有三种日期的类型都一样。请注意,在下例中,如果我们不指定格式的话,as.Date会自动解析%Y-%m-%d或%Y/%m/%d形式的日期:

the_start_of_time<-as.Date("1970-01-01")
the_end_of_time<-as.Date("2012-12-21")
all_time<-the_end_of_time - the_start_of_time
print(all_time)

        下面使用class和unclass来查看时间all_time存储之间的差别:

class(all_time)
unclass(all_time)

        使用difftime函数来计算出日期和时间的差值,它以数字的形式存储并以天为单位。由于时间之间的差别,天数被自动选择为“最敏感”的单位。差别短于一天的时间一小时、分钟或秒来表示。我们可以使用difftime函数来更好地控制单位。

difftime(the_end_of_time,the_start_of_time,units="secs")
difftime(the_end_of_time,the_start_of_time,units="weeks")

        生成序列的seq函数也适用于日期。这在创建人工生成的日期(artificial date)的测试数据集时尤其有用。在by参数中,单位的选择对于POSIX和date类型是有所不同的。

seq(the_start_of_time,the_end_of_time,by="1 year")
seq(the_start_of_time,the_end_of_time,by="500 days")

        许多其他基本的函数也允许操作日期。对它们可以使用repeat、round以及cut函数。也可以使用mean和summary来计算均值和汇总统计值。使用 methods(class = "POSIXt") 以及 methods(class = "Date") 能查看很多相关的函数。

2、lubridate

        lubridate是在日期处理的过程中,使代码的可读性更强。

        为了取代strptime,lubridate有多种使用了预设格式的解析函数。ymd接受年、月、日的日期形式。规范上有一定的灵活性:一些基本的分隔符都能使用,如连字符、正反斜杠、冒号和空格;月份可以用数字、完整的英文名或缩写来标注;也可以使用星期几,但不是强制地。它的优点在于,相同向量中的不同元素可以使用不用的格式(只要年月日的先后顺序不变)

install.packages("lubridate")
library(lubridate)
john_harrison_birth_date<-c(
  "1693-03 24",
  "1693/03//24",
  "Tuesday+1693.03*24"
)
ymd(john_harrison_birth_date)

        请记住ymd要以正确的顺序获取日期。如果我们的日期数据的形式有所不同,可以使用lubridate提供的其他函数(ydm、mdy、myd、dmy和dym)。这些函数都有相关的函数用于指定特定的时间格式,例如ymd_h、ymd_hm和ymd_hms。如果我们的日期不在以上任何一种格式中,则使用更低级的函数parse_date_time来实现。

        lubridate中的所有解析函数都会返回POSIXct日期,默认都是用UTC时区。

        lubridate提供了stamp函数来格式化日期,使我们以更可读的方式指定格式。当指定一个日期,它会返回一个用于日期格式化的函数。

moon_landing_lt<-as.POSIXlt("1969-07-20 20:17:40")
print(moon_landing_lt)
date_format_function<-stamp(
  "A moon landing occurred on 01 January 1900 at 18:00:00."
)
date_format_function(moon_landing_lt)

        lubridate有三种不同类型的变量可用于时间范围的处理。“持续时间”(Duration)指定的时间跨度为秒的倍数,所以一天的总时间是86400秒,一年的时间3156000秒(86400×365)。对于间隔均匀的时间来说,指定日期范围会很容易,但闰年和夏时令会把问题变复杂。

duration_one_to_ten_years<-dyears(1:10)
print(duration_one_to_ten_years)
today()+duration_one_to_ten_years

        其他用于创建连续时间的函数为dseconds、dminutes等。对于混合分组的规范则使用new_duration。

        “周期”(period)根据时钟上的时间来指定时间跨度。这意味着,在把它们添加到一个瞬间之前,它们确切的时间跨度是看不出来的。例如,一年的周期是365天还是366天,这取决于它是否是闰年。

period_one_to_ten_years<-years(1:10)
print(period_one_to_ten_years)
today()+period_one_to_ten_years

        除了years,还可以使用seconds、minutes以及new_period等来创建周期。

        “间隔”(interval)定义为某段具有开始和结束的时间。它们本身用处不大,最常用于指定持续时间和周期,当我们已知开始和结束日期(而非持续的时间)时。它们也可用于持续时间和周期之间的转换。例如,如果要将一年的持续时间直接转换为周期只能大约估计,因为一年可能是365或366天。

library(lubridate)
a_year<-dyears(1)
as.period(a_year)

        当起始(或结束)时间的日期已知时,我们可以使用interval和一个媒介把持续时间转换为周期,例如:

start_date<-ymd("2016-02-28")
interval_over_leap_year<-interval(
  start_date,
  start_date+a_year
)
as.period(interval_over_leap_year)

        间隔也有一些便于使用的操作符,即用于定义间隔的%--%,以及用于检查日期是否包含在间隔之内的%within%:

ymd("2016-02-28")%--%ymd("2016-03-01")
ymd("2016-02-29")%within%interval_over_leap_year

        对于时区的处理,with_tz允许我们改变日期的时区而无须把它打印出来。它还能正确地处理POSIXlt日期:

now_ct<-Sys.time()
now_lt<-as.POSIXlt(now_ct)
with_tz(now_lt,tz="America/Los_Angeles")
with_tz(now_lt,tz="Asia/Kolkata")
with_tz(now_lt,tz="Australia/Adelaide")

        还有一些其他的实用函数可用于日期的算术运算,尤其是floor_data和ceiling_date:

floor_date(today(),"year")
ceiling_date(today(),"year")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值