Странные проблемы преобразования с POSIXct

Мне нужна помощь в понимании и устранении странного поведения, связанного с as.POSIXct.

Я работаю с трехлетними световыми данными, собранными с 15-минутными интервалами с трех разных приборов. Чтобы сопоставить эти данные с другим набором данных, я пытаюсь создать интерполированные измерения освещенности с 5-минутными интервалами, используя zoo.

Странные проблемы возникают, когда я конвертирую дату и время с помощью as.POSIXct. Преобразование корректно работает с большинством наборов данных, но постоянно возвращает время на один час назад для трех определенных периодов времени: 13.03.11 2:00:00 - 2:45:00, 11.03.12 2:00. :00 - 2:45:00 и 10.03.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

person user2654270    schedule 05.08.2013    source источник


Ответы (1)


Это вызвано переходом на летнее время. Вам нужно установить аргумент 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"
person Joshua Ulrich    schedule 06.08.2013