strptime возвращает два NA, хотя до и после работает нормально

Что я делаю неправильно??

я использую

    dates<- strptime(dataframe$Measurement.Time,"%d.%m.%Y %H:%M",tz="")

для преобразования строк символов в даты. Это отлично работает на 14780 наблюдениях. Но в двух случаях он возвращает NA.

Это пример, где это сработало. Выдержки взяты из одного и того же результирующего фрейма данных.

head(dataframe.with.dates)
        date.time      Measurement.Time mü.mü.VWC.1 øC.Temp.1
1 2000-01-10 00:30:00  10.01.2000 0:30       -0.011      -0.6
2 2000-01-10 01:00:00  10.01.2000 1:00       -0.011      -0.6
3 2000-01-10 01:30:00  10.01.2000 1:30       -0.011      -0.6

Это выдержка из моего результирующего фрейма данных, показывающая два результата, в которых что-то пошло не так:

subset(dataframe.with.dates,is.na(dataframe.with.dates$date.time))
          date.time Measurement.Time  mü.mü.VWC   øC.Temp
    9572      <NA>  29.03.2015 2:00      -0.011      -0.6
    9573      <NA>  29.03.2015 2:30      -0.011      -0.6

где «date.time» находится в POSIXlt, а «Measurement.time» — исходная дата в character.

Я проверил исходный файл .txt, из которого я получил данные, но не смог найти никакой разницы с измерениями выше и ниже.


person Habesha    schedule 11.01.2018    source источник


Ответы (1)


Поиск в Google «летнего времени 29.03.2015» показывает, что это была дата весеннего перехода на летнее время в Европе, например: https://www.timeanddate.com/news/time/europe.-starts-dst-2015.html

Часовые пояса — это кошмар: я бы подумал, что использование tz="CET" поможет, но это не так. strptime(mt,"%d.%m.%Y %H:%M",tz="UTC+01:00") не жалуется, но выдает время в формате UTC. Возможно, проще всего будет использовать tz="GMT" и притвориться, что время стандартное, даже если оно не...

Я уверен, что есть дубликаты, но проще ответить на ваш вопрос, чем найти их (я потратил несколько минут на попытки).

person Ben Bolker    schedule 11.01.2018
comment
Правильно, это час, которого не существует при переходе на летнее время весной. Однако мой регистратор этого не учитывает. Он остается на зимнее время в течение всего года. Как я могу предотвратить переход strptime на летнее время? - person Habesha; 11.01.2018
comment
помогает ли использование tz="GMT" / дает ли вам то, что вы хотите? - person Ben Bolker; 11.01.2018
comment
Использование "UTC+01:00" кажется наиболее подходящим для этого варианта использования. Вы говорите, но это создает время в UTC. Невозможно создать то, что хочет OP, без использования часового пояса, в котором нет летнего времени. Весной не бывает зимы. Вместо этого просто используйте смещение зимнего времени от UTC. - person Joshua Ulrich; 12.01.2018
comment
@BenBolker: tz="GMT" действительно помогает, он распознает все временные метки, как и UTC. Однако это не мой часовой пояс, для моего приложения это нормально @JoshuaUlrich: "UTC+01:00" не распознается моей системой. Там написано "unknown timezone". - person Habesha; 16.01.2018
comment
@Habesha: попробуйте "UTC+0100" (без двоеточия). Это то, что предлагается в ?strptime. - person Joshua Ulrich; 17.01.2018
comment
@JoshuaUlrich, я не понимаю, почему, но все предлагаемые решения возвращают unknown timezone. Однако я обнаружил, что "Etc/GMT+1" работает. Вот где я это нашел . Может ли кто-нибудь помочь мне со значением Est? - person Habesha; 24.01.2018
comment
@Habesha: "Etc" — это сокращение от et cetera. Вы не говорите, в какой операционной системе вы используете R; то, как обрабатываются даты/время и часовые пояса, зависит от ОС. Так что может случиться так, что ваша ОС не распознает "UTC+0100" как допустимый часовой пояс, но распознает "Etc/GMT+1". - person Joshua Ulrich; 24.01.2018