在包含两种日期格式的字符列中转换为日期

问题描述 投票:3回答:4

我有带有“日期”列的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,所以我可以相互减去日期?

r datetime strptime
4个回答
8
投票

如果您只有两种日期时间格式,则不需要外部软件包。只需通过解析器运行两种格式,然后采用不丢失的一种格式:

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"

据我所知,绝对没有办法自动处理模棱两可的日期格式,因此硬编码可能是解决此问题的方法。


4
投票

正如@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>


2
投票
[这里是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")


-2
投票
并非所有*.csv文件都被均等创建。如果日期信息以Excel或开放办公室格式编码为日期,而只是以两种不同的格式显示在文件中,则在电子表格环境中更改日期比尝试在R中解决任务要容易得多。] >
© www.soinside.com 2019 - 2024. All rights reserved.