将熊猫系列转换为日期时间

时间:2019-11-07 10:26:16

标签: 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=['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'])

1 个答案:

答案 0 :(得分:0)

您可以使用

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'])

第一个\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}/)?-可选的2位数字,然后是/
    • \d{2}-两位数字
    • (?:\d{2})?-2位数字的可选序列。
  • \b-单词边界

请参见this regex demo

second regex标准化年份部分:\b9\d\b匹配一个9位数字,然后匹配整个单词中的任何1位数字(不包含数字,字母或_两位数)。请注意,替换模式中的\g<0>是对整个匹配值的反向引用。

pd.to_datetime(df['dates'])将列值转换为日期时间值。