熊猫数据框解析字符串列以将日期提取到新列中

时间:2019-02-13 23:37:26

标签: python regex pandas

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

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)

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

1 个答案:

答案 0 :(得分: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

详细信息

  • (?<!\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)-不允许在右边立即输入数字