解析日期向量并混合使用日期格式

时间:2019-05-16 04:56:57

标签: r date parsing

我有大量带有datetime列的csv文件,这些文件过去已经过手动修补,现在包括两种日期格式:

dd / mm / yyyy hh:mm

mm / dd / yyyy hh:mm

我无法从转换点正确解析日期

我将lubridate :: parse_date_time()用于我拥有的订单:

parse_date_time(date_time, orders = c("dmY HM", "mdY HM", "Ymd HMS"))

当其中一个值大于12且被正确标识为一天而不是一个月时,此方法工作正常。问题是日期使用以下两种格式(正确或不正确)进行解析时:

例如:2011年3月4日 可能是:2011-04-03或2011-03-04

1 个答案:

答案 0 :(得分:0)

如果您要根据注释中建议的顺序进行操作,则可以执行以下操作。如果缺少很长一段时间,而且我还没有完全测试逻辑,那么您肯定会遇到问题

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))