У меня есть большое количество CSV-файлов со столбцом даты и времени, которые были вручную исправлены в прошлом и теперь включают два формата даты:
дд/мм/гггг чч:мм
мм/дд/гггг чч:мм
У меня возникают проблемы с правильным синтаксическим анализом даты из точки переключения
Я использую lubridate::parse_date_time() с имеющимися у меня заказами:
parse_date_time(date_time, orders = c("dmY HM", "mdY HM", "Ymd HMS"))
Это прекрасно работает, когда одно из значений больше 12 и поэтому правильно определяется как день, а не месяц. Проблема заключается в том, что дата анализируется (правильно или неправильно) с использованием любого формата:
например: 04.03.2011 может быть: 2011-04-03 или 2011-03-04
Я не вижу другого варианта, кроме как вручную указать, какие даты в каком формате. Ни одна библиотека не может правильно угадывать неоднозначные даты без какого-либо другого индикатора.
Я не рекомендую использовать dmY и mdY вместе. Вы уверены, что данные содержат и то, и другое?
Спасибо за комментарии, вы подтвердили мои опасения. Я пытаюсь работать с углом, в котором даты упорядочены, поэтому есть точка изменения, когда проанализированная дата отличается от нескольких месяцев: 05/01/2012 >>> 1/05/2012, которая анализируется на 2012-01-25 >>> 2012-05-01, поэтому шаг изменения составляет более дня.





Если вы хотите основывать его на порядке, как вы предложили в комментариях, вы можете сделать что-то вроде того, что я сделал ниже. Вы определенно можете столкнуться с проблемами, если отсутствуют длительные периоды, и я не проверил логику полностью.
library(dplyr)
library(zoo)
#Made up some data
testinput <- read.table(sep = ",",
text = "25/03/2010 01:00
03/04/2010 02:00
15/04/2010 01:00
05/01/2010 07:00
16/05/2010 09:00
05/20/2010 15:00
05/22/2010 08:00
01/06/2010 21:00
20/06/2010 14:00"
)
# try converting it both ways
test <- testinput %>% mutate(date1 = as.POSIXct(V1, format = "%d/%m/%Y %H:%M"),
date2 = as.POSIXct(V1, format = "%m/%d/%Y %H:%M"))
#check the order - not sure if there is a better way to do this
test2 <- test %>% mutate(date1test = date1 >= lag(zoo::na.locf(date1, na.rm = F))&
date1<= lead(zoo::na.locf(date1,fromLast=T, na.rm = F)),
date2test = date2 >= lag(zoo::na.locf(date2, na.rm = F))&
date2<= lead(zoo::na.locf(date2,fromLast=T, na.rm = F)))
#pick which one to use
test2 %>% mutate(Out =
case_when(is.na(date2)~date1,
is.na(date1)~date2,
date1test~date1,
date2test~date2))
03/04/2011, без какой-либо другой информации, совершенно неоднозначно и может означать либо 3 апреля, либо 4 марта. Вам нужен какой-то способ отличить их друг от друга.