Изменение столбца даты / времени на дату 24 часа - PullRequest
0 голосов
/ 27 января 2020

Пример данных: Блок таблицы с обоими типами даты / времени

SITE                         DATE.TIME              TEMP
Shacklefordck_w_2018         10/29/18 11:30:00AM    22.202
TompkinsCk_w_2014             5/14/2014 8:00        21.461

У меня есть столбец даты / времени в формате m/d/yy H:M, но несколько раз в столбце в 12 часов с AM / PM, а иногда и 24 часа. Я хочу их всех за 24 часа, чтобы потом использовать strptime, чтобы разделить дату и время на два разных столбца. Эта проблема возникла, потому что я продолжаю получать NA, используя этот код:

Time <- format(as.POSIXct(strptime(bigdf$DATE.TIME, "%m%d%Y %H:%M", tz="")), format = "%H:%M")
Date <- format(as.POSIXct(strptime(bigdf$DATE.TIME, "%m%d%Y %H:%M", tz="")), format = "%m%d%Y")

bigdf$DATE <- Date
bigdf$TIME <- Time

Я хочу, чтобы все мои записи даты / времени были m/d/yy H:M за 24 часа без AM / PM. Я пробовал

newbigdf <- as.Date(bigdf$DATE.TIME, format= "%m%d%Y %H:%M") 
bigdf$DATE.TIME <- newbigdf #nope still NA

1 Ответ

0 голосов
/ 27 января 2020

После моего комментария ...

  1. Используйте grep + регулярные выражения для определения различных форматов
  2. Используйте grep результаты, чтобы применить соответствующее преобразование к POSIXct
# Make example dataframe with different datetime formats
df <- data.frame(string = c("10/29/18 11:30:00AM",
                            "10/29/18 4:30:00PM",
                            "5/14/2014 8:00",
                            "5/14/2014 14:00"), 
                 stringsAsFactors = F)

# Use RegEx to ID different formats
idx.1 <- grep(df$string, pattern = "\\d{1,2}/\\d{1,2}/\\d{4}\\s")
idx.2 <- grep(df$string, pattern = "\\d{1,2}/\\d{1,2}/\\d{2}\\s")

#  Add format column to df
df$format[idx.1] <- 1
df$format[idx.2] <- 2

## Apply POSIX conversions
df$POSIX[idx.1] <- as.POSIXct(df$string[idx.1], format = "%m/%d/%Y %H:%M")
df$POSIX[idx.2] <- as.POSIXct(df$string[idx.2], format = "%m/%d/%y %I:%M:%S%p")
df$POSIX <- as.POSIXct(df$POSIX, origin = "1970-01-01")

df

приводит к data.frame:

               string format               POSIX
1 10/29/18 11:30:00AM      2 2018-10-29 11:30:00
2  10/29/18 4:30:00PM      2 2018-10-29 16:30:00
3      5/14/2014 8:00      1 2014-05-14 08:00:00
4     5/14/2014 14:00      1 2014-05-14 14:00:00

Регулярное выражение + grep

Самый простой способ различить форматы - это отметить использование новых дат 2 ди git лет, тогда как в более раннем формате даты используется 4 ди git лет. После этого шаблон поиска по регулярному выражению:

"\\d{1,2}/\\d{1,2}/\\d{2}\\s"

можно интерпретировать как:

"(1-2 digits)/(1-2 digits)/(2 digits)(space)"

будет правильно определять форматы даты 2 di git year. Обратите внимание на двойную обратную косую черту при использовании регулярных выражений в R.

...