在时间序列内转换时区

时间:2015-02-05 16:20:36

标签: r time timezone time-series timezone-offset

我使用库中的parse_date_time函数(lubridate)将时间序列引入R中,然后将其作为EST引入。

streamflowDateTime<-parse_date_time(streamflowDateTime,"%m%d%Y %H%M",tz="EST")

但是,数据在04-03-2005 01:45经历DST,下一步是03:00。我想通过减去一个小时来转换这个事件以及随后到EST的所有时间戳,以便它是连续的。如果有一个自动化的方法可以在程序中找出DST开始发生的地方并且自己向后移动一小时,因为DST不会在同一天同时生效,这将是首选。

这是一个数据样本

structure(c(1112475600, 1112476500, 1112477400, 1112478300, 1112479200, 
1112480100, 1112481000, 1112481900, 1112482800, 1112483700, 1112484600, 
1112485500, 1112486400, 1112487300, 1112488200, 1112489100, 1112490000, 
1112490900, 1112491800, 1112492700, 1112493600, 1112494500, 1112495400, 
1112496300, 1112497200, 1112498100, 1112499000, 1112499900, 1112500800, 
1112501700, 1112502600, 1112503500, 1112504400, 1112505300, 1112506200, 
1112507100, 1112508000, 1112508900, 1112509800, 1112510700, 1112515200, 
1112516100, 1112517000, 1112517900, 1112518800, 1112519700, 1112520600, 
1112521500, 1112522400, 1112523300, 1112524200, 1112525100, 1112526000, 
1112526900, 1112527800, 1112528700, 1112529600, 1112530500, 1112531400, 
1112532300, 1112533200, 1112534100, 1112535000, 1112535900, 1112536800, 
1112537700, 1112538600, 1112539500, 1112540400, 1112541300, 1112542200, 
1112543100, 1112544000, 1112544900, 1112545800, 1112546700, 1112547600, 
1112548500, 1112549400, 1112550300, 1112551200, 1112552100, 1112553000, 
1112553900, 1112554800, 1112555700, 1112556600, 1112557500, 1112558400, 
1112559300, 1112560200, 1112561100, 1112562000, 1112562900, 1112563800, 
1112564700, 1112565600, 1112566500, 1112567400, 1112568300, 1112569200
), class = c("POSIXct", "POSIXt"), tzone = "EST")

编辑:

streamflowDateTime[8840:length(streamflowDateTime)] <- streamflowDateTime[8840:length(streamflowDateTime)]-hours(1)

在完整的整个数据集中,出现在位置8840,我手动知道,我希望代码自动找到两个连续时间戳之间的时差不是15分钟的位置并替换&#39 ; 8840&#39;在具有该自动值的代码中。 for循环太慢了

1 个答案:

答案 0 :(得分:1)

您可以提供完整的IANA时区ID America/New_York,而不是时区缩写。

parse_date_time(streamflowDateTime,"%m%d%Y %H%M",tz="America/New_York")

使用America/New_York将正确考虑EST和EDT,包括它们之间的正确转换。

这似乎得到支持,如in this blog post所示 - 至少在提供IANA / Olson时区的系统上,例如Linux或Mac。

根据the docs

  

... R没有预定义的列表区域名称,但依赖于用户的操作系统来解释时区名称。因此,某些名称将在某些计算机上识别,而在其他计算机上识别。但是,大多数计算机将识别最初由Arthur Olson编译的时区数据库中的名称。这些名称通常采用“国家/城市”的形式。 ...

由于Windows使用自己的一组时区,因此您可能无法使用IANA / Olson标识符。但是:

  • 等效的Windows时区ID为"Eastern Standard Time"。 (尽管名称,这涵盖了EST和EDT)。我不确定R是否支持这些。

  • 当前规则的完全限定POSIX时区将为"EST5EDT,M3.2.0,M11.1.0"。这适用于所有操作系统 - 但它仅代表自2007年更改以来的美国东部时区。

    • 从1987年到2006年,规则将是"EST5EDT,M4.1.0,M10.5.0"。对您正在使用的值使用适当的规则。如果您的日期跨越这些期间,则需要将它们拆分并单独处理,或者如果可能,编写函数以使用正确的数据规则

另见the timezone tag wiki