Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用dataframe解析字符串列将日期提取到新列中_Python_Regex_Pandas - Fatal编程技术网

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)"