pd to_datetime没有将DDMMMYYYY日期转换为python中的datetime

时间:2018-04-11 16:09:07

标签: python pandas datetime

这是我的数据的样子。如您所见,有些列采用DDMMMYYYY格式,有些是NaN,有些是标准的DD / MM / YYYY格式。

completion_date_latest      15/03/2001
completion_date_original    15/03/2001
customer_birth_date_1       30/11/1970
customer_birth_date_2       20/11/1971
d_start                      01Feb2018
latest_maturity_date        28/02/2021
latest_valuation_date       15/03/2001
sdate                              NaN
startdt_def                        NaN
obs_date                     01Feb2018

我想将它们转换为datetime字段。我在列表中列出了一个名为varlist2的列,并且我将它们循环到a)删除NA&b;和b)使用to_datetime函数转换为datetime:

for m in range (0,len(varlist2)):
    date_var = varlist2[m]
    print('MM_Dates transform variable: ' + date_var)

    mm_dates_base[date_var] = pd.to_datetime(mm_dates_base[date_var], errors='ignore', dayfirst=True)
    mm_dates_base[date_var] = mm_dates_base[date_var].fillna('')

然而,当我检查输出时,我得到了这个,其中d_start和obs_date没有被转换。知道为什么会出现这种情况以及我可以做些什么来解决它?

In [111]: print(mm_dates_base.iloc[0])
completion_date_latest      2001-03-15 00:00:00
completion_date_original    2001-03-15 00:00:00
customer_birth_date_1       1970-11-30 00:00:00
customer_birth_date_2       1971-11-20 00:00:00
d_start                               01Feb2018
latest_maturity_date        2021-02-28 00:00:00
latest_valuation_date       2001-03-15 00:00:00
sdate                                          
startdt_def                                    
obs_date                              01Feb2018

我有什么想法可以同时处理DDMMMYYYY日期吗?

2 个答案:

答案 0 :(得分:1)

您可以选择由varlist2列定义到DataFrame的所有列,然后使用apply + to_datetimeerrors='coerce'将有问题的格式转换为{{1如果不可能转换的话。最后由combine_first替换NaT并分配回来:

NaT

另一个更快的解决方案是循环每列:

df1 = mm_dates_base[varlist2].apply(pd.to_datetime, errors='coerce', dayfirst=True)
df2 = mm_dates_base[varlist2].apply(pd.to_datetime, errors='coerce', format='%d%b%Y')

mm_dates_base[varlist2] = df1.combine_first(df2)
print (mm_dates_base)
  completion_date_latest completion_date_original customer_birth_date_1  \
0             2001-03-15               2001-03-15            1970-11-30   

  customer_birth_date_2    d_start latest_maturity_date latest_valuation_date  \
0            1971-11-20 2018-02-01           2021-02-28            2001-03-15   

  sdate startdt_def   obs_date  
0   NaT         NaT 2018-02-01  

快速比较:

for col in varlist2:
    a = pd.to_datetime(mm_dates_base[col], errors='coerce', dayfirst=True)
    b = pd.to_datetime(mm_dates_base[col], errors='coerce', format='%d%b%Y')
    mm_dates_base[col] = a.combine_first(b)

答案 1 :(得分:0)

to_datetime函数通常会检测转换时日期的格式,但d_startobs_date中缺少空格可能是导致错误的原因。您可能必须对这些特定值/列运行.strptime()。你必须对此进行调查,但从它的外观来看,它会遵循%d%b%Y之类的内容。