Python 将panda系列转换为日期时间

Python 将panda系列转换为日期时间,python,regex,pandas,Python,Regex,Pandas,我有一组句子,我需要从中提取变量格式的日期。之后,我需要清理数据,例如,如果只存在年份,我需要添加1作为日期,1作为月份。为此,我提取了日期,但要清除日期序列,我需要将其转换为日期时间。我这样做时出错了 import pandas as pd date_sent = ["This is year 2019","on 9/95","on 7/27/2019 sjd sdkn","7/24/2019 dhd dskdh"] df = pd.DataFrame(date_sent, columns

我有一组句子,我需要从中提取变量格式的日期。之后,我需要清理数据,例如,如果只存在年份,我需要添加1作为日期,1作为月份。为此,我提取了日期,但要清除日期序列,我需要将其转换为日期时间。我这样做时出错了

import pandas as pd

date_sent = ["This is year 2019","on 9/95","on 7/27/2019 sjd sdkn","7/24/2019 dhd dskdh"]

df = pd.DataFrame(date_sent, columns=['text'])
df['dates'] = df['text'].str.findall(r'(?:\d{1,2})?/?(?:\d{2})?/?\d{2,4}')
#print(dates.head())
#df['dates'].str.replace(r'(*/*/\d\d)', lambda x: x.groups()[0][0]+1900)
#TRIED THIS TO ADD 1900 to a year if it is only yy but it snot working as well
df['dates']=pd.to_datetime(df['dates'].to_string())
#print(df['dates'])
你可以用

df['dates'] = df['text'].str.extract(r'\b((?:\d{1,2}/)?(?:\d{2}/)?\d{2}(?:\d{2})?)\b')
df['dates'] = df['dates'].str.replace(r'\b9\d\b', r'19\g<0>')
df['dates']=pd.to_datetime(df['dates'])
df['dates']=df['text'].str.extract(r'\b((?:\d{1,2}/)?(?:\d{2}/)?\d{2}(?:\d{2})?)\b')
df['dates']=df['dates'].str.replace(r'\b9\d\b',r'19\g')
df['dates']=pd.to_datetime(df['dates'])
第一个
\b((?:\d{1,2}/)(?:\d{2}/)?\d{2}(?:\d{2})\b
正则表达式匹配:

  • \b
    -单词边界
  • ((?:\d{1,2}/)(?:\d{2}/)?\d{2}(?:\d{2})
    -捕获组1(
    Series.str.extract
    需要至少一个捕获组,因为它只返回捕获):
    • (?:\d{1,2}/)?
      -一个由1或2位数字组成的可选序列,然后是
      /
    • (?:\d{2}/)?
      -两位数字的可选序列,然后是
      /
    • \d{2}
      -两位数字
    • (?:\d{2})
      -可选的两位数字序列
  • \b
    -单词边界

标准化年份部分:
\b9\d\b
匹配一个
9
数字,然后匹配任何一个数字作为一个完整的单词(没有数字、字母或
\uu
包含这两个数字)。注意,替换模式中的
\g
是对整个匹配值的反向引用


pd.to_datetime(df['dates'])
将列值转换为datetime值。

是否希望每个项有多个匹配项?您想如何治疗
9/95
<代码>1/9/95或
9/1/95
?每个项目将不会有一个匹配项。95视为1995年和def格式,mm/dd/yyTry
df['dates']=df['text'].str.extract(r'\b((?:\d{1,2}/)(?:\d{2}/)?\d{2}(?:\d{2})\b')
,然后
df['dates']=df['dates'].str.replace(r'\b9\d\b',r'19\g')
,然后
df dates[]df dates[]。但是,它将从每一行提取第一个日期。或者,使用您的方式并
df['dates']=pd.to_datetime(df['dates'].to_string(),推断出_datetime_format=True)
当我使用.extract((r'(?:\d{1,2})/(?:\d{2,4})时,我得到了错误值error:pattern不包含捕获组。但是当我使用.extract(r'\b((?:\d{1,2}/)?(?:\d{2}/)?\d{2}(?:\d{2}))\b')时,它很好。你能告诉我为什么吗?