После моего комментария ...
- Используйте
grep
+ регулярные выражения для определения различных форматов - Используйте
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.