关于日期:在R中处理东部标准时间(EST)和东部夏令时(EDT)

Dealing with Eastern Standard Time (EST) and Eastern Daylight Savings (EDT) in R

我有一系列来自水质连续监测探头的数据集,日期和时间设置在东部标准时间(EST),因此没有校正夏令时(EDT)。在R中,当从MS访问数据库导入数据表时,字段被识别为因子,但是当使用as.POSIXct()进行转换时,2016-03-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))

有没有办法将因子或字符字段转换为POSIXct字段,同时保留EST时区指定?或者有没有办法识别并将正确的日期和时间转换为EST和EDT?

我四处走动,无法得到任何工作。我试图转换为GMT(或UTC)然后转换回EST(tz ="America / New_York")。我意识到这是一个持续的问题,使用日期和时间数据的人,特别是在R中的人会喜欢离开EDT。

任何帮助都表示赞赏......我在这个问题上的最终结果。


使用POSIX tz ="America/New_York"的问题在于夏令时(UTC-4或UTC-5),即使基础时间戳存储在美国东部标准时间(UTC-5)中也是如此。

您应该能够将您的tz指定为Etc/GMT+5。 从那里,很容易在东部时间,东部当地时间和格林威治标准时间之间进行转换。 请注意,在R中,UTC以西的时区用正偏移量表示(请参阅?timezone中的时区名称文档)。

以下是一些示例数据(夏令时于美国东部时间2016年3月16日凌晨2:00生效):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

祝好运!


在转换为POSIX期间,您需要指定时区。 看这个例子:

1
2
3
4
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)))
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,但在第二种情况下,指定了东方标准,并给出了期望的结果。