在R

时间:2016-05-05 14:47:21

标签: r date time dst

我有一系列来自水质连续监测探头的数据集,日期和时间设置在东部标准时间(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。

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

3 个答案:

答案 0 :(得分:8)

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

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

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

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
祝你好运!

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我在使用不遵守夏令时的水质数据时遇到了类似的问题。我发现有用的解决方法是使用 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