R在包含两种日期格式的一列中更改日期格式

时间:2017-02-08 00:17:57

标签: r

我的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,那么我可以相互减去日期吗?

4 个答案:

答案 0 :(得分: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"

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

答案 1 :(得分:4)

正如@thelatemail所说,很难处理不明确的日期格式。你在这里遇到了最糟糕的情况:(北美)月 - 日 - 年和(日常工作)日 - 月 - 年的组合。

现在,anytime软件包在这里帮助 ,因为它允许我们解析而不需要显式格式,同时允许不同的输入格式相同的字符串

然而,它也必须保持一定的理智 - 因此支持混合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 :(得分:1)

以下是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")

答案 3 :(得分:-2)

并非所有/usr/bin/python2个文件都是平等创建的。如果日期信息被编码为Excel中的日期或开放式办公室格式,但只是在文件中以两种不同的格式显示,那么更改电子表格环境中的日期要比尝试解决R中的任务要简单得多。 / p>