2015-02-05 36 views
2

我使用library(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循环太慢

+0

你可以发布你的原始输入'streamflowDateTime'(之前调用'parse_Date_time')吗? – nrussell 2015-02-05 17:05:36

+0

这是一个长度为35034个元素的数据集我不知道如何在这里发布 – Saadat 2015-02-05 18:46:31

+0

另外,我阅读了之前发布的解决方案。它不工作,因为它将整个数据集转换为EST。基本上,如果我将数据作为EDT带入数据库,然后找到DST开始发生的位置,并将所有数据从该点向前转换为EST,我认为这会有所帮助! – Saadat 2015-02-05 18:48:38

回答

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

+0

当我尝试这样做时,所有的值都转换为NA,并且控制台显示“Warning in view 所有格式都无法解析。没有格式找到“ – Saadat 2015-02-06 15:03:12

+0

你在什么操作系统上运行? – 2015-02-06 16:08:02

+0

Windows 7 Ultimate – Saadat 2015-02-06 16:09:37