Python 使用dataframe解析字符串列将日期提取到新列中
我有一个包含字符串列的数据框: 我只想从中提取日期并添加到一个新列中 我尝试了以下操作,但它只返回列的原始字符串值:Python 使用dataframe解析字符串列将日期提取到新列中,python,regex,pandas,Python,Regex,Pandas,我有一个包含字符串列的数据框: 我只想从中提取日期并添加到一个新列中 我尝试了以下操作,但它只返回列的原始字符串值: df['date'] = df.text.replace({r"\d{2}[\/ ](\d{2}|January|Jan)[\/ ]\d{2,4}"},regex=True) 解决此问题的最佳方法是什么?您可以使用.str.extract(),使用\d{1,2}匹配1位天数和月份,并将添加到分隔符模式: df['date'] = df['text'].str.extract(r
df['date'] = df.text.replace({r"\d{2}[\/ ](\d{2}|January|Jan)[\/ ]\d{2,4}"},regex=True)
解决此问题的最佳方法是什么?您可以使用
.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})?)")
看
另外,请注意,\d{2}(?:\d{2})
匹配2位或4位数字,\d{2,4}
匹配2位、3位或4位数字
请注意,整个regex模式使用捕获组包装,这是必要的,因为.str.extract
至少需要一个捕获组才能工作,它将只生成捕获的文本
为了匹配不在其他数字内的日期,您可以在开始处添加(?),在结束处添加(?!\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)"
r“(?您可能想要df['date']=df['text'].str.extract(r“(\d{2}[/.](?:\d{2}一月[/.]\d{2}(?:\d{2})”)
我在下面添加了一个更合适的模式。如何修改它以允许文本中也包含两位数的日期?例如02/13,2/13etc@user10添加可选组,请参见,(?
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)"