在 R 中处理东部标准时间 (EST) 和东部夏令时 (EDT)
Dealing with Eastern Standard Time (EST) and Eastern Daylight Savings (EDT) in R
我有一系列来自水质连续监测探测器的数据集,日期和时间设置为东部标准时间 (EST),因此没有夏令时 (EDT) 校正。在 R 中,当从 MS 访问数据库导入数据 table 时,字段被识别为因素,但是当使用 as.POSIXct() 日期和时间从 2016 年的 02:00(24 时钟)转换时03-13 成为 NA。这是由于从 EST 到 EDT 的过渡...因此从技术上讲 2016-03-13 02:00 不存在。
以创建的一些数据为例
test<-data.frame(Date=rep(as.Date("2016-03-13"),120),Hour=rep(seq(0,23,1),5),Min=rep(seq(0,60,15),24))
有没有办法在保留 EST 时区指定的同时将因子或字符字段转换为 POSIXct 字段?或者有没有办法识别正确的日期和时间并将其转换为 EST 和 EDT?
我转了又转,什么也做不了。我试图转换为 GMT(或 UTC)然后转换回 EST(tz="America/New_York")。我意识到这是一个持续存在的问题,使用日期和时间数据的人,尤其是使用 R 的人会喜欢远离 EDT。
感谢任何帮助...我在这方面束手无策。
在转换为 POSIX 期间,您需要指定时区。看这个例子:
test<-data.frame(Date=rep(as.Date("2016-03-13"),96),Hour=rep(seq(0,23,1), each=4),Min=rep(seq(0,45,15)))
wrong<-as.POSIXct(paste(test$Date, test$Hour, test$Min), format="%Y-%m-%d %H %M")
ans<-as.POSIXct(paste(test$Date, test$Hour, test$Min), format="%Y-%m-%d %H %M", tz="EST")
compare<-cbind(test, wrong, ans)
在向量 "wrong" 中,没有指定时区,因此没有指定 NA,但在第二种情况下指定了东部标准,并给出了所需的结果。
使用 POSIX tz = "America/New_York"
的问题是考虑了夏令时(UTC-4 或 UTC-5),即使基础时间戳存储在 U.S 中.东部标准时间 (UTC-5)。
您应该可以将您的 tz 指定为 Etc/GMT+5
。从那里,可以很容易地在美国东部时间、东部当地时间和格林威治标准时间之间进行转换。请注意,在 R 中,UTC 以西的时区用正偏移表示(请参阅 ?timezone
中的时区名称文档)。
以下是一些示例数据(夏令时于 2016 年 3 月 16 日东部时间 2:00 上午生效):
StartTime=as.numeric(as.POSIXct("2016-03-11 0:00:00",format="%Y-%m-%d %H:%M",origin="1970-01-01",tz="Etc/GMT+5"))
EndTime=as.numeric(as.POSIXct("2016-03-15 0:00:00",format="%Y-%m-%d %H:%M",origin="1970-01-01",tz="Etc/GMT+5"))
Interval=15*60 #15-min
data.EST=as.POSIXct(seq(from = StartTime,to = EndTime, by=Interval),origin="1970-01-01",tz="Etc/GMT+5") #generate date stamps
# convert Eastern Standard Time (in R: GMT+5) to local time (accounts for daylight savings):
data.EastCoast<- format(data.EST, tz="America/New_York")
# convert Eastern Standard Time (in R: GMT+5) to UTC/GMT:
data.UTC<- format(data.EST, tz="GMT")
compare.times<-data.frame(data.EST,data.EastCoast,data.UTC)
compare.times[(198:203),]
data.EST data.EastCoast data.UTC
198 2016-03-13 01:15:00 2016-03-13 01:15:00 2016-03-13 06:15:00
199 2016-03-13 01:30:00 2016-03-13 01:30:00 2016-03-13 06:30:00
200 2016-03-13 01:45:00 2016-03-13 01:45:00 2016-03-13 06:45:00
201 2016-03-13 02:00:00 2016-03-13 03:00:00 2016-03-13 07:00:00
202 2016-03-13 02:15:00 2016-03-13 03:15:00 2016-03-13 07:15:00
203 2016-03-13 02:30:00 2016-03-13 03:30:00 2016-03-13 07:30:00
祝你好运!
我 运行 使用不遵守夏令时的水质数据遇到类似问题。我发现有用的解决方法是使用 America/Jamaica
而不是 America/New_York
。下面是 GMT 偏移列表和要使用的 tz
。
- -4 =
America/Virgin
- -5 =
America/Jamaica
- -6 =
America/Regina
- -8 =
Pacific/Pitcairn
- -9 =
Pacific/Gambier
- -10 =
Pacific/Honolulu
我有一系列来自水质连续监测探测器的数据集,日期和时间设置为东部标准时间 (EST),因此没有夏令时 (EDT) 校正。在 R 中,当从 MS 访问数据库导入数据 table 时,字段被识别为因素,但是当使用 as.POSIXct() 日期和时间从 2016 年的 02:00(24 时钟)转换时03-13 成为 NA。这是由于从 EST 到 EDT 的过渡...因此从技术上讲 2016-03-13 02:00 不存在。
以创建的一些数据为例
test<-data.frame(Date=rep(as.Date("2016-03-13"),120),Hour=rep(seq(0,23,1),5),Min=rep(seq(0,60,15),24))
有没有办法在保留 EST 时区指定的同时将因子或字符字段转换为 POSIXct 字段?或者有没有办法识别正确的日期和时间并将其转换为 EST 和 EDT?
我转了又转,什么也做不了。我试图转换为 GMT(或 UTC)然后转换回 EST(tz="America/New_York")。我意识到这是一个持续存在的问题,使用日期和时间数据的人,尤其是使用 R 的人会喜欢远离 EDT。
感谢任何帮助...我在这方面束手无策。
在转换为 POSIX 期间,您需要指定时区。看这个例子:
test<-data.frame(Date=rep(as.Date("2016-03-13"),96),Hour=rep(seq(0,23,1), each=4),Min=rep(seq(0,45,15)))
wrong<-as.POSIXct(paste(test$Date, test$Hour, test$Min), format="%Y-%m-%d %H %M")
ans<-as.POSIXct(paste(test$Date, test$Hour, test$Min), format="%Y-%m-%d %H %M", tz="EST")
compare<-cbind(test, wrong, ans)
在向量 "wrong" 中,没有指定时区,因此没有指定 NA,但在第二种情况下指定了东部标准,并给出了所需的结果。
使用 POSIX tz = "America/New_York"
的问题是考虑了夏令时(UTC-4 或 UTC-5),即使基础时间戳存储在 U.S 中.东部标准时间 (UTC-5)。
您应该可以将您的 tz 指定为 Etc/GMT+5
。从那里,可以很容易地在美国东部时间、东部当地时间和格林威治标准时间之间进行转换。请注意,在 R 中,UTC 以西的时区用正偏移表示(请参阅 ?timezone
中的时区名称文档)。
以下是一些示例数据(夏令时于 2016 年 3 月 16 日东部时间 2:00 上午生效):
StartTime=as.numeric(as.POSIXct("2016-03-11 0:00:00",format="%Y-%m-%d %H:%M",origin="1970-01-01",tz="Etc/GMT+5"))
EndTime=as.numeric(as.POSIXct("2016-03-15 0:00:00",format="%Y-%m-%d %H:%M",origin="1970-01-01",tz="Etc/GMT+5"))
Interval=15*60 #15-min
data.EST=as.POSIXct(seq(from = StartTime,to = EndTime, by=Interval),origin="1970-01-01",tz="Etc/GMT+5") #generate date stamps
# convert Eastern Standard Time (in R: GMT+5) to local time (accounts for daylight savings):
data.EastCoast<- format(data.EST, tz="America/New_York")
# convert Eastern Standard Time (in R: GMT+5) to UTC/GMT:
data.UTC<- format(data.EST, tz="GMT")
compare.times<-data.frame(data.EST,data.EastCoast,data.UTC)
compare.times[(198:203),]
data.EST data.EastCoast data.UTC
198 2016-03-13 01:15:00 2016-03-13 01:15:00 2016-03-13 06:15:00
199 2016-03-13 01:30:00 2016-03-13 01:30:00 2016-03-13 06:30:00
200 2016-03-13 01:45:00 2016-03-13 01:45:00 2016-03-13 06:45:00
201 2016-03-13 02:00:00 2016-03-13 03:00:00 2016-03-13 07:00:00
202 2016-03-13 02:15:00 2016-03-13 03:15:00 2016-03-13 07:15:00
203 2016-03-13 02:30:00 2016-03-13 03:30:00 2016-03-13 07:30:00
祝你好运!
我 运行 使用不遵守夏令时的水质数据遇到类似问题。我发现有用的解决方法是使用 America/Jamaica
而不是 America/New_York
。下面是 GMT 偏移列表和要使用的 tz
。
- -4 =
America/Virgin
- -5 =
America/Jamaica
- -6 =
America/Regina
- -8 =
Pacific/Pitcairn
- -9 =
Pacific/Gambier
- -10 =
Pacific/Honolulu