我有一组句子,需要从中提取可变格式的日期。之后,我需要清理数据,例如,如果仅存在年份,则需要添加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'])
答案 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'])
将列值转换为日期时间值。