【发布时间】:2014-07-29 16:36:46
【问题描述】:
在我的数据集中,有一列包含许多员工的出生日期,其中许多员工的出生日期在 1960 年到 1980 年之间。我正在尝试使用 as.Date 对其进行格式化,其中一些结果并不符合我的预期。
例子:
as.Date("7/1/61","%m/%d/%y")
我希望它返回“1961-07-01”,但它返回“2061-07-01”。
【问题讨论】:
在我的数据集中,有一列包含许多员工的出生日期,其中许多员工的出生日期在 1960 年到 1980 年之间。我正在尝试使用 as.Date 对其进行格式化,其中一些结果并不符合我的预期。
例子:
as.Date("7/1/61","%m/%d/%y")
我希望它返回“1961-07-01”,但它返回“2061-07-01”。
【问题讨论】:
阅读:
?strptime # where all the formatting details are available
%y
没有世纪的年份 (00–99)。输入时,值 00 到 68 以 20 为前缀,69 到 99 以 19 为前缀——这是 2004 年和 2008 年 POSIX 标准指定的行为,但他们也说“预计在未来的版本中,默认世纪是从两位数的年份会发生变化。
所以你需要一个正则表达式来回溯,最好在发送到 as.Date 之前作为字符串转换:
dvec <- c("7/1/61", "7/1/79")
as.Date( sub("/(..$)", "/19\\1",dvec) , "%m/%d/%Y")
[1] "1961-07-01" "1979-07-01"
如果这投入生产,当您的员工年龄开始超过当前年份的最后两位数时,它将成为一个等待发生的错误。
【讨论】:
yy-mm-dd 格式提供服务的数据科学家来说,这将是非常棒的......我从经验中说,从不允许两位数的年份.我认为as.Date 函数应该有一个可选参数来设置它。