从pandas列中提取任何格式的日期(日期是较长字符串的一部分)

时间:2019-07-12 20:56:13

标签: python pandas

我正在尝试从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列?

2 个答案:

答案 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
相关问题