【问题标题】:Inserting prefix of 19 into a string date将前缀 19 插入字符串日期
【发布时间】:2017-02-10 17:01:25
【问题描述】:

我有一个出生日期向量,格式为“10-Feb-85”的字符串。

当我在 R 中使用 as.Date() 函数时,它假定两位数年份是 2000 年之后(这些出生日期都不是 2000 年之后)。

示例: as.Date(x = "10-Feb-52", format = "%d-%b-%y")

返回:2052-02-10

我不精通正则表达式,但是 我认为这是正则表达式在第二个“-”之后或最后两位数字之前插入“19”的机会。

我找到了一个正则表达式,可以向前计数三个字符并插入一个字母:

gsub(pattern = "^(.{3})(.*)$", replacement = "\\1d\\2", x = "abcefg")

但我不确定如何从最后数两个。

感谢任何帮助。

【问题讨论】:

  • 来自?strptime :在输入时,值 00 到 68 以 20 为前缀,而 69 到 99 以 19 为前缀——这是 2004 年和 2008 年 POSIX 标准指定的行为,但它们也说 '预计在未来的版本中,从 2 位数年份推断的默认世纪将发生变化。
  • @WiktorStribiżew ,我对数据足够熟悉。 1800 年代可能有一些,但我对此表示怀疑。
  • 你可以试试lubridatelubridate::dmy(c("10-Feb-85", "10-Feb-15")) [1] "1985-02-10" "2015-02-10"
  • @UweBlock:那你加19或者20,在开头加,而任务是在后面的最后2位只加19第二个连字符。
  • 另外,建议作为欺骗源的cron solution 插入2019,这不是这里所期望的。

标签: r regex date


【解决方案1】:

在第二个“-”之后或最后两位数字之前插入一个“19”。

在最后两位数字之前:

gsub(pattern = "-(\\d{2})$", replacement = "-19\\1", x = "10-Feb-52")

请参阅R demo。在这里,- 首先匹配,然后是字符串末尾的 2 个数字 ((\\d{2})) ($) - 被匹配并捕获到组 1。

第二个-之后:

gsub(pattern = "^((?:[^-]*-){2})", replacement = "\\119", x = "10-Feb-52")

another demo。在这里,除了- ([^-]*) 之外的 0+ 个字符的 2 个序列 ({2}) 从字符串 (^) 的开头匹配并捕获到组 1。替换包含一个反向引用,用于恢复替换结果中捕获的文本。

【讨论】:

  • 那么“15 年 2 月 10 日”呢?这不应该变成 2015-02-10 吗?
  • @UweBlock:问 OP,acc。对于当前的问题,它不应该。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多