这是我的数据的样子。如您所见,有些列采用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日期吗?
答案 0 :(得分:1)
您可以选择由varlist2
列定义到DataFrame
的所有列,然后使用apply
+ to_datetime
和errors='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_start
和obs_date
中缺少空格可能是导致错误的原因。您可能必须对这些特定值/列运行.strptime()
。你必须对此进行调查,但从它的外观来看,它会遵循%d%b%Y
之类的内容。