首页 > 解决方案 > Pandas concat 不能正确处理时间戳列?

问题描述

默认情况下连接两个数据帧(使用 concat)时,concat 创建一个新的数据帧,其中包含两者的列的并集,并使用 nan 设置结果中任何缺失列的值。例如...

import pandas as pd
a = pd.DataFrame({'A':range(5), 'B':range(5)})
b = pd.DataFrame({'A':range(5)})
pd.concat([a , b], sort=False)

    A   B
0   0   0.0
1   1   1.0
...
3   3   NaN
4   4   NaN

但是,如果其中一个数据框中的缺失列包含时间戳,则会中断......

a = pd.DataFrame({'A':range(5), 'B':[pd.Timestamp.utcnow() for _ in range(5)]})
b = pd.DataFrame({'A':range(5)})
pd.concat([a , b], sort=False)

引发“AttributeError:'NoneType' 对象没有属性 '_can_consolidate'”。

蟒蛇3.6.5;熊猫0.23;视窗 7 x64

这是已知问题吗?
他们有任何已知的解决方法吗?

标签: pythonpython-3.xpandas

解决方案


正如评论中所解释的,这是一个已知问题(参见GH22796)并且在 0.24 版中已修复。同时,有两种可能的解决方法。

一种是转换为字符串:

df = pd.concat([a.assign(B=a.B.astype(str)), b], sort=False) 
df['B'] = pd.to_datetime(df['B'], errors='coerce')
df

   A                          B
0  0 2018-12-06 18:21:35.363477
1  1 2018-12-06 18:21:35.363728
2  2 2018-12-06 18:21:35.363740
3  3 2018-12-06 18:21:35.363748
4  4 2018-12-06 18:21:35.363756
0  0                        NaT
1  1                        NaT
2  2                        NaT
3  3                        NaT
4  4                        NaT

正如@root 提到的,另一个是初始化一个空列b

pd.concat([a, b.assign(B=pd.NaT)], sort=False)

   A                                 B
0  0  2018-12-06 18:21:35.363477+00:00
1  1  2018-12-06 18:21:35.363728+00:00
2  2  2018-12-06 18:21:35.363740+00:00
3  3  2018-12-06 18:21:35.363748+00:00
4  4  2018-12-06 18:21:35.363756+00:00
0  0                               NaT
1  1                               NaT
2  2                               NaT
3  3                               NaT
4  4                               NaT

推荐阅读