一个数据系列(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)
答案 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
的下一个版本不会出现此问题。