3

我有一堆我正在解析的日期,格式为“%m/%d/%y”。as.Date(dates, format = "%m/%d/%y")将“1/01/64”之类的日期转换为“2064-01-01”,但我需要将其设为“1964-01-01”。我想我可以找到年份是未来的例子,然后减去一个世纪,但这似乎有点荒谬。

4

2 回答 2

3

日期在内部存储为整数天,因此在输入或输出时只有这样的格式。至于没有世纪信息的输入,我认为你不走运。以下是 ?strptime 关于 %y 格式规范的说明:“在输入时,值 00 到 68 以 20 为前缀,而 69 到 99 以 19 为前缀——这是 2004 年和 2008 年 POSIX 标准指定的行为,但他们也说 '预计在未来的版本中,从两位数年份推断的默认世纪将发生变化'。”

  as.Date( "01/01/64", "%m/%d/%y", origin="1970-01-01") -100*365.25
  #[1] "1964-01-01"

鉴于 Y2K 在过去如此之近,可能会针对允许删除世纪信息的程序员发起一场酒吧之战。

由于默认假设 00-68 年为 2000-2068,因此当然可以创建 as.Dateshift

于 2012-08-01T23:53:18.783 回答
2

修复日期的另一种方法是将未来发生的所有年份(相对于使用 Sys.Date() 的今天日期)更改为以 19 而不是 20 开头。

dates=as.Date(c("01/01/64", "12/31/15"))
# [1] "2064-01-01" "2015-12-31" ## contains an incorrect date

## Now correct the dates that havn't yet occurred
as.Date(ifelse(dates > Sys.Date(), format(dates, "19%y-%m-%d"), format(dates)))
#[1] "1964-01-01" "2015-12-31"
于 2017-07-20T20:29:05.467 回答