Pandas concat没有正确处理Timestamp列?

Yma*_*eth 6 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
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

抛出"AttributeError:'NoneType'对象没有属性'_can_consolidate'".

Python 3.6.5; 熊猫0.23; Windows 7 x64

这是已知的问题吗?
他们是否知道任何变通方法?

cs9*_*s95 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
Run Code Online (Sandbox Code Playgroud)

另一种,正如@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
Run Code Online (Sandbox Code Playgroud)