当一次是本地的时候进行DST校正,一次是GMT

时间:2018-03-03 22:10:02

标签: r lubridate

一个数据系列(nycflights13 ::航班)是当地时间,一个是GMT(nycflights13 :: weather)。问题是以尊重DST的方式合并它们。如果我们看1月1日,美国/纽约和格林威治标准时间之间的时差应为5小时。六月应该是4个小时。在下面的示例中,我在1月和6月得到了5小时的差异 - unique(fw1$hour.y)unique(fw6$hour.y)都返回17,但似乎fw6$hour.y应该是16。我做错了什么?

library(tidyverse)
library(lubridate)
library(nycflights13)
weather$time_hour <- with_tz(weather$time_hour, 'GMT')
flights$time_hour <- force_tz(flights$time_hour, 'America/New_York')
fw <- left_join(flights, weather, by=c('origin', 'time_hour'))
fw1 <- filter(fw, origin == 'LGA', month.x == 1, day.x == 1, hour.x == 12)
unique(fw1$hour.y)

fw6 <- filter(fw, origin == 'LGA', month.x == 6, day.x == 1, hour.x == 12)
unique(fw6$hour.y)

2 个答案:

答案 0 :(得分:1)

我的理解是'time_hour'列应该由每个对象中的年,月,日,小时,列组成。但是当我查看'time_hour'与'月'列的月份时,我得到了奇怪的结果。

library(lubridate)
library(nycflights13)
weather$time_hour <- with_tz(weather$time_hour, 'GMT')
with(weather, table(month, month(time_hour)))

month    1    2    3    4    5    6    7    8    9   10   11   12
   1  2229    0    0    0    0    0    0    0    0    0    0    0
   2     0 2010    0    0    0    0    0    0    0    0    0    0
   3     0    0 2227    0    0    0    0    0    0    0    0    0
   4     0    0    3 2156    0    0    0    0    0    0    0    0
   5     0    0    0    3 2229    0    0    0    0    0    0    0
   6     0    0    0    0    3 2157    0    0    0    0    0    0
   7     0    0    0    0    0    3 2225    0    0    0    0    0
   8     0    0    0    0    0    0    3 2214    0    0    0    0
   9     0    0    0    0    0    0    0    3 2156    0    0    0
   10    0    0    0    0    0    0    0    0    3 2209    0    0
   11    0    0    0    0    0    0    0    0    0    0 2138    0
   12    0    0    0    0    0    0    0    0    0    0    0 2159

根据“月份”列的值,您可以看到在夏令时期间有几天不符合您的预期。因此,这似乎是源数据的问题......几乎就像应用了恒定的4小时偏移而不考虑夏令时。

答案 1 :(得分:1)

这似乎是nycflights13版本2.2(可能更早)中的错误。文件weather.R从下载的源天气文件生成月,日和小时。然后,它会在ISOdatetime()中使用这些变量来生成time_hour变量,但不指定时区。

这意味着虽然原始天气数据是GMT而没有夏令时,但生成包时创建的time_hour变量将包含在创建包的任何本地时区中指定的夏令时。加载包时强制时区并不能改变夏令时已经合并到time_hour中的事实。

nycflights13的当前开发版本在生成time_hour变量时指定了时区,因此nycflights13的下一个版本不会出现此问题。