日期时间值在重新分配期间意外转换为整数

时间:2019-06-05 15:36:03

标签: python pandas datetime

我有以下df

inv_date
24/01/2008
nan
nan
nan
13/08/2007
02/04/2007
02/04/2007
03/04/2007
03/04/2007
03/04/2007
04/04/2007
09/08/2007 12:16:55

inv_date中的值都是字符串,我尝试使用一些代码将它们转换为datetime64;从format中推断出inv_date是最常见的日期格式,而我之所以不对str[:10]进行切片,是因为大多数值并不总是日/月/年,有时还可以包括时/分/秒,因此将值切成固定位置并不理想;

inv_date

事实证明是

failed_rows = pd.isnull(pd.to_datetime(data.df['inv_date'], errors='coerce', format='%d/%m/%Y'))

if failed_rows.sum():
   df.loc[failed_rows, 'inv_date'] = pd.to_datetime(df.loc[failed_rows, 'inv_date'], errors='coerce').dt.floor('D')

   df.loc[~failed_rows, 'inv_date'] = pd.to_datetime(df.loc[~failed_rows, 'inv_date'], errors='coerce', format='%d/%m/%Y')

理想的结果应该看起来像

inv_date
1201132800000000000
None
None
None
1186963200000000000
1175472000000000000
1175472000000000000
1175558400000000000
1175558400000000000
1175558400000000000
1175644800000000000
1189209600000000000

inv_date 24/01/2008 NaT NaT NaT 13/08/2007 02/04/2007 02/04/2007 03/04/2007 03/04/2007 03/04/2007 04/04/2007 09/08/2007 dtype

1 个答案:

答案 0 :(得分:1)

只需将其转换为日期时间,将其标准化并转换回字符串即可。 NaT被保留。

(pd.to_datetime(df['inv_date'], errors='coerce')
   .dt.normalize()
   .dt.strftime('%d/%m/%Y'))

0     24/01/2008
1            NaT
2            NaT
3            NaT
4     13/08/2007
5     04/02/2007
6     04/02/2007
7     04/03/2007
8     04/03/2007
9     04/03/2007
10    04/04/2007
11    08/09/2007
Name: inv_date, dtype: object