我有带有“日期”列的CSV文件,但它包含以下两种不同的日期格式
7/12/2015 15:28 as m/d/yyyy hh:mm
18-04-2016 18:20 as d/m/yyyy hh:mm
如何将格式更改为m / d / yyyy hh:mm,所以我可以相互减去日期?
如果您只有两种日期时间格式,则不需要外部软件包。只需通过解析器运行两种格式,然后采用不丢失的一种格式:
x <- c("7/12/2015 15:28","18-04-2016 18:20")
pmax(
as.POSIXct(x, format="%m/%d/%Y %H:%M", tz="UTC"),
as.POSIXct(x, format="%d-%m-%Y %H:%M", tz="UTC"),
na.rm=TRUE
)
#[1] "2015-07-12 15:28:00 UTC" "2016-04-18 18:20:00 UTC"
据我所知,绝对没有办法自动处理模棱两可的日期格式,因此硬编码可能是解决此问题的方法。
正如@thelatemail所说,很难处理模糊日期格式。您在这里遇到的情况最糟:(北美)月日年与(工作其余时间)日月年的组合。
现在,anytime包在这里帮助[[大体上,因为它允许我们解析不需要显式格式,同时还允许在同一字符串中使用不同的输入格式。
但是,它也必须保持一定的理智性-因此not
像在默认情况下一样,支持混合d / m / y和m / d / y,因为没有办法使它自动化。 但是这里我们可以opt
添加一个缺少的格式,一切都很好:R> library(anytime)
R> anytime::addFormats("%d-%m-%Y %H:%M:%S") # add a day-month-year variant
R> anytime(c("7/12/2015 15:28", "18-04-2016 18:20"))
[1] "2015-07-12 15:28:00 CDT" "2016-04-18 18:20:00 CDT"
R>
因此,区别很简单
R> diff(anytime(c("7/12/2015 15:28", "18-04-2016 18:20"))) Time difference of 281.119 days R>
lubridate
的另一个选项library(lubridate)
parse_date_time(x, c("mdy HM", "dmy HM"))
#[1] "2015-12-07 15:28:00 UTC" "2016-04-18 18:20:00 UTC"
数据
x <- c("7/12/2015 15:28","18-04-2016 18:20")
*.csv
文件都被均等创建。如果日期信息以Excel或开放办公室格式编码为日期,而只是以两种不同的格式显示在文件中,则在电子表格环境中更改日期比尝试在R中解决任务要容易得多。] >