在 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

-4 = America/Virgin -5 = America/Jamaica -6 = America/Regina -8 = Pacific/Pitcairn -9 = Pacific/Gambier -10 = Pacific/Honolulu

【讨论】:

以上是关于在 R 中处理东部标准时间 (EST) 和东部夏令时 (EDT)的主要内容,如果未能解决你的问题,请参考以下文章

美国东部标准时间 11 月 4 日至 5 日的夏令时问题

.NET 中的“美国东部标准时间”与“东部标准时间”

Spark:考虑夏令时将 GMT 时间戳转换为东部时间

时区缩写

如何在 Dynamics CRM 中获取时区的夏令时开始和结束?

django 中的日期时间错误