我需要一些帮助来理解并解决与as.POSIXct
相关的一些奇怪行为。
我正在使用三年的光照数据,每隔15分钟从三个不同的仪表收集。为了将这些数据与另一个数据集相匹配,我试图使用 zoo 以5分钟的间隔创建插值光测量。
使用as.POSIXct
转换日期和时间时会出现奇怪的问题。转换适用于大多数数据集,但始终将时间设置为三个特定时间段的一小时:03/13/11 2:00:00 - 2:45:00,03 / 11/12 2:00 :00 - 2:45:00和03/10/13 2:00:00 - 2:45:00我已经从下面的R控制台发布了结果。任何人都可以解释这种行为并提出解决方案?
> Ldata <- read.csv("9813306_LI_AIRTEM_HENGILL2_SUM.csv")
> head(Ldata)
X. date time Temp_C Light_lux
1 1 10/29/10 15:30:00 2.195 3444.5
2 2 10/29/10 15:45:00 1.330 3100.0
3 3 10/29/10 16:00:00 1.330 3100.0
4 4 10/29/10 16:15:00 1.221 2927.8
5 5 10/29/10 16:30:00 1.221 2152.8
6 6 10/29/10 16:45:00 1.112 1463.9
> str(Ldata)
'data.frame': 88417 obs. of 5 variables:
$ X. : int 1 2 3 4 5 6 7 8 9 10 ...
$ date : Factor w/ 923 levels "1/1/11","1/1/13",..: 105 105 105 105 105 105 105 105 105 105 ...
$ time : Factor w/ 98 levels "0:00:00","0:15:00",..: 33 34 35 36 37 38 39 40 41 42 ...
$ Temp_C : num 2.19 1.33 1.33 1.22 1.22 ...
$ Light_lux: num 3444 3100 3100 2928 2153 ...
这是给我带来麻烦的数据部分
> Ldata[c(12908:12911, 44194:44197, 79136:79139),]
X. date time Temp_C Light_lux
12908 12908 3/13/11 2:00:00 -5.496 0
12909 12909 3/13/11 2:15:00 -5.249 0
12910 12910 3/13/11 2:30:00 -5.995 0
12911 12911 3/13/11 2:45:00 -6.246 0
44194 44197 3/11/12 2:00:00 0.674 0
44195 44198 3/11/12 2:15:00 0.563 0
44196 44199 3/11/12 2:30:00 0.453 0
44197 44200 3/11/12 2:45:00 0.343 0
79136 79139 3/10/13 2:00:00 -2.494 0
79137 79140 3/10/13 2:15:00 -2.610 0
79138 79141 3/10/13 2:30:00 -2.377 0
79139 79142 3/10/13 2:45:00 -2.610 0
> P_datetime <- as.POSIXct(paste(Ldata$date, Ldata$time), format = "%m/%d/%y %H:%M:%S")
> Ldata_m <- cbind(Ldata, P_datetime)
请注意P_datetime
如何比时间列提前1小时。
> Ldata_m[duplicated(Ldata_m$P_datetime),]
X. date time Temp_C Light_lux P_datetime
12908 12908 3/13/11 2:00:00 -5.496 0 2011-03-13 01:00:00
12909 12909 3/13/11 2:15:00 -5.249 0 2011-03-13 01:15:00
12910 12910 3/13/11 2:30:00 -5.995 0 2011-03-13 01:30:00
12911 12911 3/13/11 2:45:00 -6.246 0 2011-03-13 01:45:00
44194 44197 3/11/12 2:00:00 0.674 0 2012-03-11 01:00:00
44195 44198 3/11/12 2:15:00 0.563 0 2012-03-11 01:15:00
44196 44199 3/11/12 2:30:00 0.453 0 2012-03-11 01:30:00
44197 44200 3/11/12 2:45:00 0.343 0 2012-03-11 01:45:00
79136 79139 3/10/13 2:00:00 -2.494 0 2013-03-10 01:00:00
79137 79140 3/10/13 2:15:00 -2.610 0 2013-03-10 01:15:00
79138 79141 3/10/13 2:30:00 -2.377 0 2013-03-10 01:30:00
79139 79142 3/10/13 2:45:00 -2.610 0 2013-03-10 01:45:00
答案 0 :(得分:2)
这是夏令时造成的。您需要在tz=
来电中设置as.POSIXct
参数,以匹配记录数据的时区。例如,如果设置tz="UTC"
则没有问题:
> as.POSIXct(paste(Ldata$date, Ldata$time), format="%m/%d/%y %H:%M:%S", tz="UTC")
# [1] "2011-03-13 02:00:00 UTC" "2011-03-13 02:15:00 UTC"
# [3] "2011-03-13 02:30:00 UTC" "2011-03-13 02:45:00 UTC"
# [5] "2012-03-11 02:00:00 UTC" "2012-03-11 02:15:00 UTC"
# [7] "2012-03-11 02:30:00 UTC" "2012-03-11 02:45:00 UTC"
# [9] "2013-03-10 02:00:00 UTC" "2013-03-10 02:15:00 UTC"
# [11] "2013-03-10 02:30:00 UTC" "2013-03-10 02:45:00 UTC"