Не удается преобразовать дату и время с am/pm из символа в целое число

После загрузки данных даты и времени из CSV-файла я вижу дату и время с am/pm, но в символьном формате и, следовательно, не могу добавить линию регрессии. При попытке преобразовать в целое число с помощью stprtime я создаю новый столбец, который теперь является целым числом, однако он потерял информацию о am/pm. Как сохранить эту информацию?

Пример данных "wpplot":

    Date    Irrigation  Rep ID  WP
6/29/17 12:40 PM    Reduced 1   11B -14.3
6/29/17 12:50 PM    Reduced 1   11B -14.4
6/29/17 1:00 AM Reduced 1   11B -14.5
6/29/17 1:10 AM Reduced 1   11B -14.5
6/29/17 1:20 AM Reduced 1   11B -14.5
6/29/17 1:30 AM Reduced 1   11B -14.5
6/29/17 1:40 AM Reduced 1   11B -14.5
6/29/17 1:50 AM Reduced 1   11B -14.5
6/29/17 2:00 AM Reduced 1   11B -14.5
6/29/17 2:10 AM Reduced 1   11B -14.5
6/29/17 2:20 AM Reduced 1   11B -14.5
6/29/17 2:30 AM Reduced 1   11B -14.5

Код:

attach(wpplot)
wpplot$datefinish<-strptime(wpplot$Date, format = "%m/%d/%y %H:%M %p")

ОБНОВЛЕНИЕ:

При использовании strptime я не могу различить am/pm. Языковой стандарт установлен на English_United States (ОС — Windows).

> Sys.getlocale("LC_TIME") 
[1] "English_United States.1252"
> 
> Sys.setlocale("LC_TIME", "English")
[1] "English_United States.1252" 
wpplot$datefinish<-strptime(wpplot$Date, format = "%m/%d/%y %I:%M %p")
> datefinish
[1] "2017-06-29 12:40:00 PDT" "2017-06-29 12:50:00 PDT" 
"2017-06-29 01:00:00 PDT" "2017-06-29 01:10:00 PDT"

person David    schedule 26.07.2017    source источник
comment
обеспечить вывод dput(head(wpplot,10)).   -  person M--    schedule 26.07.2017


Ответы (1)


Формат am/pm работает только тогда, когда он написан строчными буквами, а не AM/PM, как в вашем примере. Также обратите внимание, что я изменил %H на %I, как указано в ?strptime.

Приведенное ниже помогло мне.

wpplot$Date       <- tolower(wpplot$Date)
wpplot$datefinish <- strptime(wpplot$Date, format = "%m/%d/%y %I:%M %p")

Однако в документации также указано, что поведение AM/PM зависит от локали:

Специфичные для локали преобразования в строки символов и обратно используются там, где это уместно и доступно. Это влияет на названия дней и месяцев, индикатор AM/PM (если используется) и разделители в таких форматах, как %x и %X, через настройку категории локали LC_TIME.

Обновлять

Мы можем немного изменить время, чтобы быть уверенными, что правильно понимаем концепцию am/pm (это 00:40 после полудня или только что за полночь?).

wpplot$Date[1] <- "6/29/17 02:40 pm"  # This is definitely 14:40 29th of June

# CORRECT:
strptime(wpplot$Date, format = "%m/%d/%y %I:%M %p")
# [1] "2017-06-29 14:40:00 CEST" "2017-06-29 12:50:00 CEST"
# [3] "2017-06-29 01:00:00 CEST" "2017-06-29 01:10:00 CEST"
# [5] "2017-06-29 01:20:00 CEST"

Обратите внимание, что я использовал format = "%m/%d/%y %I:%M %p", а не format = "%m/%d/%y %H:%M %p":

# WRONG
strptime(wpplot$Date, format = "%m/%d/%y %H:%M %p")
# [1] "2017-06-29 02:40:00 CEST" "2017-06-29 12:50:00 CEST"
# [3] "2017-06-29 01:00:00 CEST" "2017-06-29 01:10:00 CEST"
# [5] "2017-06-29 01:20:00 CEST"
person KenHBS    schedule 26.07.2017
comment
Спасибо за предупреждение относительно случая am/pm. Однако даже после преобразования новый столбец datefinish по-прежнему не содержит информации об am/pm. - person David; 27.07.2017
comment
@David, я отредактировал вопрос на основе ваших правок и еще одной мысли с моей стороны. Очевидно, у вас уже были строчные буквы am/pm, но оказалось, что это ничего не меняет в результате. - person KenHBS; 27.07.2017
comment
Я также обновил свой вопрос, добавив информацию «Sys.setlocale» и результаты strptime — по-прежнему не будет различать am/pm. - person David; 31.07.2017
comment
Просто чтобы убедиться, что вы в курсе, что 12:40 PM днем, верно? Из приведенных вами 12 примеров «неправильное» и «правильное» преобразование приводит к одному и тому же времени, даже если код выдает действительно правильное время. - person KenHBS; 31.07.2017
comment
Да, после просмотра данных выясняется, что они вводились неправильно. Я исправил значения, и все работает хорошо. Спасибо за помощь. - person David; 02.08.2017