在DST过渡期间生成日期和时间序列

时间:2014-06-04 18:07:23

标签: r lubridate

生成跨越DST边界的一系列时间的好方法是什么?

例如,

startdst <- ymd_hms("2013-03-10 00:00:00",tz="America/Los_Angeles")
enddst <- ymd_hms("2013-11-03 00:00:00",tz="America/Los_Angeles")

在美国西海岸的DST过渡日开始时创造时间。

startday <- startdst + minutes(seq(0,to = 24*60, by = 15))
endday <- enddst + minutes(seq(0,to = 24*60, by = 15))

在两天内以15分钟的间隔创建瞬间。

那给了我

> head(startday,n=16)
 [1] "2013-03-10 00:00:00 PST" "2013-03-10 00:15:00 PST"
 [3] "2013-03-10 00:30:00 PST" "2013-03-10 00:45:00 PST"
 [5] "2013-03-10 01:00:00 PST" "2013-03-10 01:15:00 PST"
 [7] "2013-03-10 01:30:00 PST" "2013-03-10 01:45:00 PST"
 [9] NA                        NA                       
[11] NA                        NA                       
[13] "2013-03-10 03:00:00 PDT" "2013-03-10 03:15:00 PDT"
[15] "2013-03-10 03:30:00 PDT" "2013-03-10 03:45:00 PDT"

即使03:00 PDT仅在太平洋标准时间01:45后15分钟。 IOW,为什么元素[9]到[12]呢?

同样,

> head(endday,n=16)
 [1] "2013-11-03 00:00:00 PDT" "2013-11-03 00:15:00 PDT"
 [3] "2013-11-03 00:30:00 PDT" "2013-11-03 00:45:00 PDT"
 [5] "2013-11-03 01:00:00 PDT" "2013-11-03 01:15:00 PDT"
 [7] "2013-11-03 01:30:00 PDT" "2013-11-03 01:45:00 PDT"
 [9] "2013-11-03 02:00:00 PST" "2013-11-03 02:15:00 PST"
[11] "2013-11-03 02:30:00 PST" "2013-11-03 02:45:00 PST"
[13] "2013-11-03 03:00:00 PST" "2013-11-03 03:15:00 PST"
[15] "2013-11-03 03:30:00 PST" "2013-11-03 03:45:00 PST"

直接从太平洋标准时间1:45到太平洋标准时间2点,即使这些时间分开了75分钟。 IOW,太平洋标准时间1点到太平洋标准时间1点45分发生了什么?

顺便说一句,lubridate知道:

> diff(endday)
Time differences in mins
 [1] 15 15 15 15 15 15 15 75 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15
[26] 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15
[51] 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15
[76] 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15
attr(,"tzone")
[1] "America/Los_Angeles"

如何在连续的条目中获得连续的时刻?

顺便说一下,这与Is there a way to assign DST transitions automatically in lubridate?松散相关。

比尔

1 个答案:

答案 0 :(得分:0)

感谢R sequence of dates with lubridate,我找到了答案:

seq(startdst,startdst+hours(4),by="15 min")
seq(enddst,enddst+hours(4),by="15 min")

我不明白为什么我原来的方法失败了;它似乎应该给出相同的答案或抛出错误。