【问题标题】:Pandas dataframe parse string column to extract dates into new columnPandas 数据框解析字符串列以将日期提取到新列中
【发布时间】:2019-02-14 07:51:42
【问题描述】:

我有一个包含字符串列的数据框:

text = ['dasndljaksdhfinwejfiv 12/05/2018'', 'akdhaouiyfbh adv12.03.2019','faytdvi advonalsdnfoaidv 5/9/2019IUAYFNVVKNVAIUEHF']

我只想从中提取日期并添加到新列中。

我尝试了以下方法,但它只返回列的原始字符串值:

df['date'] = df.text.replace({r"\d{2}[\/ ](\d{2}|January|Jan)[\/ ]\d{2,4}"},regex=True)

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 你可能想要df['date'] = df['text'].str.extract(r"(\d{2}[/. ](?:\d{2}|January|Jan)[/. ]\d{2}(?:\d{2})?)")
  • 我在下面添加了一个更合适的模式。

标签: python regex pandas


【解决方案1】:

您可以使用.str.extract(),使用\d{1,2} 来匹配1 位数的日期和月份,并将. 添加到分隔符模式中:

df['date'] = df['text'].str.extract(r"(\d{1,2}[/. ](?:\d{1,2}|January|Jan)[/. ]\d{2}(?:\d{2})?)")

请参阅regex demo

另外,请注意\d{2}(?:\d{2})? 匹配 2 位或 4 位数字,\d{2,4} 匹配 2、3 或 4 位数字。

请注意,整个正则表达式模式都用一个捕获组包裹,这是必要的,因为.str.extract 需要至少一个捕获组才能工作,它只会产生捕获的文本。

要匹配不在其他数字内的日期,您可以在开头添加(?<!\d),在末尾添加(?!\d),这可能会使模式更安全。

如果您打算匹配任何英文月份名称,您需要稍微扩展模式:

r"(?<!\d)(\d{1,2}[/. ](?:\d{1,2}|(?:J(?:an(?:uary)?|u(?:ne?|ly?))|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:t(?:ember)?)?|(?:Nov|Dec)(?:ember)?|Oct(?:ober)?))[/. ]\d{2}(?:\d{2})?)(?!\d)"

another regex demo

详情

  • (?&lt;!\d) - 不允许紧靠左边的数字
  • ( - 捕获组的开始
  • \d{1,2} - 1 位或 2 位数字
  • [/. ] - 空格,/.
  • (?:\d{1,2}|(?:J(?:an(?:uary)?|u(?:ne?|ly?))|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:t(?:ember)?)?|(?:Nov|Dec)(?:ember)?|Oct(?:ober)?)) - 月份名称,是否缩写
  • [/. ] - 空格,/.
  • \d{2}(?:\d{2})? - 2 位数字后跟可选的两位数字序列
  • ) - 捕获组结束
  • (?!\d) - 不允许紧靠右边的数字

【讨论】:

  • 如何修改它以允许文本中包含 2 位日期?如 02/13、2/13 等
  • @user10 添加可选组,见this demo(?&lt;!\d)(\d{1,2}[/. ](?:(?:\d{1,2}|(?:J(?:an(?:uary)?|u(?:ne?|ly?))|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:t(?:ember)?)?|(?:Nov|Dec)(?:ember)?|Oct(?:ober)?))[/. ])?\d{2}(?:\d{2})?)(?!\d)
猜你喜欢
  • 2017-01-21
  • 2019-12-06
  • 2021-10-26
  • 2021-01-01
  • 2022-11-18
  • 2019-02-22
  • 2018-03-23
  • 1970-01-01
  • 2020-07-01
相关资源
最近更新 更多