在lubridate :: interval()中设置POSIXct时区

时间:2015-08-13 22:03:38

标签: r lubridate

我有一个数据集rfm,其中有一个名为cohort的列,类Date,如下所示。我还有一个日历日期的向量,相当巧妙地命名为dates,其元素也是类Date

> class(rfm)
[1] "tbl_df"     "data.frame"
> class(rfm$cohort)
[1] "Date"
> class(dates)
[1] "Date" 

rfm$cohortdates都显示某个时间段内某个月的第一天的日期,dates可能涵盖最近几个月。我的问题很简单:我只想查看max(rfm$cohort)max(dates)之间有多少个月。

lubridate包使interval()函数变得简单,但该函数的参数必须是POSIXct,而不是Date个对象:

> as.period(interval(ymd(as.character(max(rfm$cohort))),ymd(as.character(max(dates)))), months)
[1] "1m 0d 0H 0M 0S"

但我是否真的需要对ymd()as.character()进行链接调用? as.POSIXct()不够吗?这是一个尝试:

> as.period(interval(as.POSIXct(max(rfm$cohort), tz = 'GMT'),as.POSIXct(max(dates), tz = 'GMT')), months)
Error in while (any(start + est * per < end)) est[start + est * per <  : 
  missing value where TRUE/FALSE needed

这不起作用。 lubridate似乎要我设置时间间隔的时区,而不是单独为其结束设置时区。像这样:

> as.period(interval(as.POSIXct(max(rfm$cohort)),as.POSIXct(max(dates)), tz = 'GMT'), months)
[1] "1m 0d 0H 0M 0S"

我知道这不是打字,所以我应该做lubridate想要的,但为什么不单独设置间隔结束的时区也有效?通过我的阅读,?interval表明该函数的第三个参数tzone应默认从第一个时区获取其值。不知何故,as.POSIXct()不会向interval()显示时区,即使它在同一个调用中明确设置。我错过了什么?

0 个答案:

没有答案