【问题标题】:Extractall dates - how to separate single years with RegEx in python?提取日期 - 如何在 python 中使用 RegEx 分隔单个年份?
【发布时间】:2020-11-29 07:00:15
【问题描述】:

我的数据框中的一列中包含测试中的一些日期。 例如,

sr = pd.Series(['04/20/2009', '04/20/09', '4/20/09', '4/3/09', '6/2008','12/2009','2010'])

我想提取这些日期.. 我一年中有一半的时间出现在“月”和“日”列中。

result = sr.str.extractall(r'(?P<month>\d{,2})[/]?(?P<day>\d{,2})[/]?(?P<year>\d{2,4})')
result

      month day year
  match         
0   0   04  20  2009
1   0   04  20  09
2   0   4   20  09
3   0   4   3   09
4   0   6   20  08
5   0   12  20  09
6   0   20  NaN 10

我该如何解决这个问题?

我只能想到将“'6/2008','12/2009','2010'”与“'04/20/2009','04/20/09','4/20/'分开处理” 09'",然后附加它们。

【问题讨论】:

  • pd.to_datetime(sr) 日期转换错误?
  • 在我的原始数据框中,日期包含在文本中,例如:“on 9/27/75 Audit C Score Current”

标签: python-3.x regex pandas date regex-group


【解决方案1】:

您可以使匹配更具体地针对月份和日期。

由于总有一年,您可以将整个组的月份和日期设为可选。

在该可选组中,您可以将月份与可选日期匹配。

(?<!\S)(?:(?P<month>1[0-2]|0?[1-9])/(?:(?P<day>3[01]|[12][0-9]|0?[1-9])/)?)?(?P<year>(?:20|19)?\d{2})(?!\S)

部分

  • (?&lt;!\S) 否定后视,断言直接在左边的不是非空白字符(左边的空白边界)
  • (?:非捕获组
    • (?P&lt;month&gt;1[0-2]|0?[1-9])/ 后跟/
    • (?:非捕获组
      • (?P&lt;day&gt;3[01]|[12][0-9]|0?[1-9])/day 后跟 /
    • )? 关闭群组并将其设为可选
  • )? 关闭组并使其成为可选
  • (?P&lt;year&gt;(?:20|19)?\d{2})年份,可选择匹配 20 或 19 和 2 位数字
  • (?!\S) 负前瞻,不直接在右侧断言非空白字符(右侧的空白边界)

Regex demo

【讨论】:

  • 感谢您的链接! (?!\S) 和 (?
  • @bluetail 它们是环视断言,表示左侧和右侧的空白边界。如果你愿意,我可以添加对模式的解释?
  • @bluetail 不,它们是非消耗性的断言。我已经部分添加了模式。
  • 我明白了。 'assert not a non whitespace'= 'asset a whitespace',非常感谢。我真的很喜欢你如何分隔月/日的数字。
  • 现在很好,我想通了。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
相关资源
最近更新 更多