将多个日期格式转换为r

时间:2016-10-24 15:36:19

标签: r date

我正在处理具有多种日期格式的凌乱excel文件

2016-10-17T12:38:41Z 
Mon Oct 17 08:03:08 GMT 2016
10-Sep-15
13-Oct-09
18-Oct-2016 05:42:26 UTC

我想以yyyy-mm-dd格式转换上述所有内容。我正在使用以下代码进行转换,但很多值都是NA。

as.Date(parse_date_time(df$date,c('mdy', 'ymd_hms','a b d HMS y','d b y HMS')))

我怎么能一起做所有这些。我已经读过类似案例的其他主题,但似乎没有什么能适用于我的案例。 请帮忙

2 个答案:

答案 0 :(得分:5)

如果我将'dmy'添加到列表中,那么至少会成功解析示例中的所有案例:

 z <- c("2016-10-17T12:38:41Z", "Mon Oct 17 08:03:08 GMT 2016", 
 "10-Sep-15",  "13-Oct-09", "18-Oct-2016 05:42:26 UTC")

library(lubridate)
parse_date_time(z,c('mdy', 'dmy', 'ymd_HMS','a b d HMS y','d b y HMS'))
## [1] "2016-10-17 12:38:41 UTC" "2016-10-17 08:03:08 UTC"
## [3] "2015-09-10 00:00:00 UTC" "2009-10-13 00:00:00 UTC"
## [5] "2016-10-18 05:42:26 UTC"

你的大问题将是第三和第四个要素:它们实际上分别是'ymd''dmy'吗?我不确定任何逻辑会让你自动检测这些差异......脱离背景,“2010年9月15日”和“2015年9月10日”似乎都是完全合理的可能性......

为了它的价值我还尝试了新的anytime package - 它只处理了第一个和最后一个元素。

答案 1 :(得分:4)

首先删除时间可以在orders中仅指定三个备选项来解析问题中的示例数据。这会将10-Sep-1513-Oct-09解释为dmy,但如果您希望将它们解释为ymd,则取消注释注释掉的行:

orders <- c("dmy", "mdy", "ymd")
# orders <- c("ymd", "dmy", "mdy")

as.Date(parse_date_time(gsub("..:..:..", " ", x), orders = orders))

,并提供:

[1] "2016-10-17" "2016-10-17" "2015-09-10" "2009-10-13" "2016-10-18"

或者如果注释掉的行被取消注释,则:

[1] "2016-10-17" "2016-10-17" "2010-09-15" "2013-10-09" "2016-10-18"

注意:输入为:

x <- c("2016-10-17T12:38:41Z ", "Mon Oct 17 08:03:08 GMT 2016", "10-Sep-15", 
"13-Oct-09", "18-Oct-2016 05:42:26 UTC")