Как преобразовать отметку даты / времени в переменную даты, чтобы узнать, сколько времени занимает собрание? - PullRequest
1 голос
/ 04 июня 2019

Я работаю над проектом, в котором мне нужно выяснить, сколько времени занимают встречи. У меня есть два столбца «STARTDATE» и «END DATE», и они являются символьными переменными. Я хочу вычесть дату окончания из даты начала, чтобы узнать, сколько времени займет собрание

Я пытался использовать as.POSIXct для преобразования переменной, но она продолжает выдавать ошибку.

STARTDATE                           ENDDATE
9  18-JAN-19 10.42.30.000000000 AM  18-JAN-19 11.01.24.000000000 AM
10 18-JAN-19 10.43.02.000000000 AM  18-JAN-19 11.02.42.000000000 AM
11 18-JAN-19 10.44.04.000000000 AM  18-JAN-19 11.05.57.000000000 AM
13 18-JAN-19 10.41.34.000000000 AM  18-JAN-19 10.53.21.000000000 AM

и я попробовал

as.POSIXct(df$STARTDATE, format="%d-%b-%y %H:%M:%S")

Все, что я получаю, это

Error in as.POSIXlt.character(x, tz, ...) : 
  character string is not in a standard unambiguous format

1 Ответ

2 голосов
/ 04 июня 2019

Проблема в том, что ваш аргумент format не соответствует фактическому формату даты:

  1. Часы, минуты и секунды отделяются . вместо :
  2. Ваши данные имеют как миллисекунды, так и разделитель AM / PM

Данные (я изменил последнее значение ENDDATE, чтобы включить время PM, потому что это показывает важный крайний случай):

df <- structure(list(STARTDATE = c("18-JAN-19 10.42.30.000000000 AM", 
    "18-JAN-19 10.43.02.000000000 AM", "18-JAN-19 10.44.04.000000000 AM", 
    "18-JAN-19 10.41.34.000000000 AM"), ENDDATE = c("18-JAN-19 11.01.24.000000000 AM", 
    "18-JAN-19 11.02.42.000000000 AM", "18-JAN-19 11.05.57.000000000 AM", 
    "18-JAN-19 10.53.21.000000000 PM")), class = "data.frame", row.names = c(NA, 
    -4L))

Если вы исправите свой аргумент format и затем примените его к каждому вектору даты, вы обнаружите, что он преобразует их в формат POSIXct:

df$STARTDATE <- as.POSIXct(df$STARTDATE, format = "%d-%b-%y %I.%M.%OS %p")
df$ENDDATE <- as.POSIXct(df$ENDDATE, format = "%d-%b-%y %I.%M.%OS %p")

            STARTDATE             ENDDATE
1 2019-01-18 10:42:30 2019-01-18 11:01:24
2 2019-01-18 10:43:02 2019-01-18 11:02:42
3 2019-01-18 10:44:04 2019-01-18 11:05:57
4 2019-01-18 10:41:34 2019-01-18 22:53:21

class(df$STARTDATE)
[1] "POSIXct" "POSIXt" 

Обратите внимание, что в списке форматов %I.%M.%OS вместо %H.%M.%OS, поскольку %I (часы с 01-12) должны использоваться с временем AM / PM, а не %H (часы с 0-23) , Спасибо М-М за это!

См. ?strptime:

% p ... Используется вместе с% I, а не с% H

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...