我正在处理具有多种日期格式的凌乱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')))
我怎么能一起做所有这些。我已经读过类似案例的其他主题,但似乎没有什么能适用于我的案例。 请帮忙
答案 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-15
和13-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")