在 R 中处理东部标准时间 (EST) 和东部夏令时 (EDT)
Posted
技术标签:
【中文标题】在 R 中处理东部标准时间 (EST) 和东部夏令时 (EDT)【英文标题】:Dealing with Eastern Standard Time (EST) and Eastern Daylight Savings (EDT) in R 【发布时间】:2016-08-31 10:04:30 【问题描述】:我有一系列来自水质连续监测探头的数据集,其日期和时间设置为东部标准时间 (EST),因此没有对夏令时 (EDT) 进行校正。在 R 中,从 MS 访问数据库导入数据表时,这些字段被视为因素,但是当使用 as.POSIXct() 从 2016 年 3 月 13 日的 02:00(24 时钟)开始转换日期和时间时,这些字段会变成 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。
感谢任何帮助...我对此束手无策。
【问题讨论】:
我想我可能已经找到了解决办法,但我不是 100% 确定。将日期时间从因子或字符转换为 POSIXct 字段时,使用 tz="Etc/GMT-5" 似乎有效......但我仍然不确定。欢迎任何方向或建议。下面的示例代码。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)))
as.POSIXct(paste(test$Date, test$Hour, test$Min), format="%Y-%m-%d %H %M", tz="Etc/GMT-5")
【参考方案1】:
使用 POSIX tz = "America/New_York"
的问题在于,即使基础时间戳存储在美国东部标准时间 (UTC-5) 中,也会考虑夏令时(UTC-4 或 UTC-5)。
您应该能够将您的 tz 指定为Etc/GMT+5
。从那里,很容易在 EST、东部当地时间和 GMT 之间转换。请注意,在 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
祝你好运!
【讨论】:
【参考方案2】:在转换为 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)
在向量“错误”中,没有指定时区,因此是 NA,但在第二种情况下,指定了东部标准并给出了所需的结果。
【讨论】:
感谢您的回复,我已经阅读了一些相互矛盾的文档,表明 R 中的“EST”指的是“澳大利亚东部标准时间”,而不是北美/加拿大的“东部标准时间”。这有很大的不同,因为“澳大利亚东部标准时间”是 UTC-10,而“东部标准时间”是 UTC-5。有时我对时区表示法感到整体困惑,因为那里有太多信息。任何积分将不胜感激。 查看 ?timezones 和 OlsonNames() 了解可能的时区列表。我在东海岸,运行 Sys.time() 返回 - “EDT” 谢谢,我也在美国东海岸跑步,做了 Sys.time() 并获得了 EDT。感谢您的投入广告指导。 对于北美东部时间,您应该使用America/New_York
代表美国或 America/Toronto
代表加拿大。不要使用缩写,因为它们可能会模棱两可。【参考方案3】:
我在使用不遵守夏令时的水质数据时遇到了类似的问题。我发现有用的解决方法是使用America/Jamaica
而不是America/New_York
。以下是 GMT 偏移量列表和要使用的 tz
。
America/Virgin
-5 = America/Jamaica
-6 = America/Regina
-8 = Pacific/Pitcairn
-9 = Pacific/Gambier
-10 = Pacific/Honolulu
【讨论】:
以上是关于在 R 中处理东部标准时间 (EST) 和东部夏令时 (EDT)的主要内容,如果未能解决你的问题,请参考以下文章