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