我正在尝试从pandas列中提取任何格式的日期(日期是较长字符串的一部分)。
我找到了this的答案,该答案在大熊猫之外完成,但是我不确定如何在大熊猫专栏中使用该答案。
日期可以采用多种格式,例如:
footballer, born October 1989
footballer, born 1900s
footballer, born 29 December 1987
Brazilian footballer, born 1983
31/02/1901
16 May 2019
是否可以将任何日期格式和部分日期作为具有日期类型的pandas列?
答案 0 :(得分:4)
使用链接的答案中的方法:
import dateutil.parser as dparser
s.apply(lambda x: dparser.parse(x,fuzzy=True).strftime('%Y-%m-%d'))
尽管dparser
当然不能应付所有可能性:在样本数据中,您必须将footballer, born 1900s
更改为footballer, born 1900's
,否则分析将抱怨秒数必须在0..59
如果需要异常处理,则必须定义一个常规函数,因为lambda无法处理try / except:
def myparser(x):
try:
return dparser.parse(x,fuzzy=True)
except:
return None
s.apply(lambda x: myparser(x))
这将为错误的日期插入NaT
值(或者您可以根据需要提供“默认日期”):
0 1989-10-12
1 NaT
2 1987-12-29
3 1983-07-12
4 NaT
5 2019-05-16
答案 1 :(得分:0)
尝试此操作,如果它不能识别出包含日期的行,则将返回1/1/1;如果日期不完整,并且日期将假定为1月1日,但是您可以通过调整来更改它默认值。
import pandas as pd
import numpy as np
from datetime import datetime
from dateutil.parser import parse
l = ['footballer, born October 1989',
'footballer, born 1900s',
'footballer, born 29 December 1987',
'Brazilian footballer, born 1983',
'31/02/1901',
'16 May 2019']
df = pd.Series(l, name='strings')
def get_dates(series):
my_list =[]
for i in range(len(series)):
for j in range(len(series[i])):
try:
my_list.append(parse(series[i][j:],default=datetime(1, 1, 1)).strftime('%Y-%m-%d'))
break
except:
pass
return pd.Series(my_list)
get_dates(df)
0 1989-10-01
1 0001-01-01
2 1987-12-29
3 1983-01-01
4 1901-01-02
5 2019-05-16
dtype: object