Pandas concat无法正确处理“时间戳记”列?

时间:2018-12-06 17:59:33

标签: python python-3.x pandas

默认情况下,将两个数据帧连接在一起(使用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'”。

Python 3.6.5;熊猫0.23; Windows 7 x64

这是已知问题吗?
他们知道有什么解决方法吗?

1 个答案:

答案 0 :(得分:2)

如评论中所述,这是一个已知问题(请参见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