在时间序列内转换时区

Converting time zones within time series

我使用库 (lubridate) 中的 parse_date_time 函数将时间序列引入 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分钟的位置并替换'具有该自动值的代码中的 8840'。 for 循环太慢

您可以只提供完整的 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 does not come with a predefined list zone names, but relies on the user's OS to interpret time zone names. As a result, some names will be recognized on some computers but not others. Most computers, however, will recognize names in the timezone data base originally compiled by Arthur Olson. These names normally take the form "Country/City." ...

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

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

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

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

另见,the timezone tag wiki