2013-02-22 76 views
1

我有一个CSV文件中的日期时间对看起来像有没有办法在lubridate中自动分配DST转换?

2012年11月4日

在一列

上午12时06分08秒

在相邻列。它们在当地时间被记录(即它们在适当的时间切换到PST和PDT),但文件中没有tz或DST指示符。检测这个唯一可见的方式是时间序列做有趣的事情。例如,于2012年11月4日,我的倍像

上午12点51分二十秒 上午01点13分08秒 上午1点24分58秒 上午一点40分28秒1 的序列: 48:08 AM 上午01时54分08秒 上午01时56分58秒 上午01点04分28秒 上午01时05分48秒 上午01时07分18秒 上午1点15分00秒 1:39 :08 AM 2:05:38 AM

PST大概是从上午1:04:28开始的,但没有指标。

是否有一个简单的方法妥善分配时间段(可能使用lubridate)?该文件很长,所以我宁愿不一次循环一次阅读,因为我担心这可能需要一些时间。我将不得不在春季做相同的事情。

回答

1

这是不可能的。有没有办法知道肯定是"11/4/2012 1:04:28 AM"是PST,而不是实际"11/4/2012 12:51:20 AM""11/4/2012 1:13:08 AM" PDT之间的观察。

如果您确定观察结果是在文件中排序的,您可以将它们转换为POSIXt并采用该向量的diff。任何负值都将是DST更改。但是,如果DST更改之间的观测时间间隔大于1小时,您可能会错过一些。

Lines <- "11/4/2012 12:51:20 AM 
11/4/2012 01:13:08 AM 
11/4/2012 01:24:58 AM 
11/4/2012 01:40:28 AM 
11/4/2012 01:48:08 AM 
11/4/2012 01:54:08 AM 
11/4/2012 01:56:58 AM 
11/4/2012 01:04:28 AM 
11/4/2012 01:05:48 AM 
11/4/2012 01:07:18 AM 
11/4/2012 01:15:00 AM 
11/4/2012 01:39:08 AM 
11/4/2012 02:05:38 AM" 

x <- scan(con <- textConnection(Lines), what="", sep="\n") 
close(con) 
diff(strptime(x, format="%m/%d/%Y %I:%M:%S %p")) 
# Time differences in mins 
# [1] 21.800000 11.833333 15.500000 7.666667 6.000000 2.833333 
# [7] -52.500000 1.333333 1.500000 7.700000 24.133333 86.500000 
+0

但是,如果在PDT或PST是唯一的选择,你知道夏令时的日期,然后你可以根据该之间挑选。虽然没有简单的方法从R获得这个日期。 – hadley 2013-02-22 13:48:25

+0

@hadley:你可以生成从第一个到最后一个观测每小时序列,将其转换为'POSIXlt'和检查时的'isdst'元素0/1切换。 – 2013-02-22 14:08:20

+0

确实如此,但由于原始数据是作为转换点存储的,所以它有点尴尬。 – hadley 2013-02-22 14:39:39

相关问题