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

5

使用 concat 连接两个 DataFrame 时,默认情况下,concat 创建一个新的 DataFrame,其中包含两个 DataFrame 列的并集,并在结果中设置任何缺失列的值为 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; Pandas 0.23; Windows 7 x64

这是已知的问题吗?
是否存在已知的解决方法?


2
是的,我认为这个问题已经在v0.24中被识别和修复了(请参见此问题:https://github.com/pandas-dev/pandas/issues/22796)。没有明显的解决方法。尝试先转换为字符串。 - cs95
3
手动先分配 NaT 列是一个潜在的解决方法,例如 pd.concat([a, b.assign(B=pd.NaT)], sort=False) - root
1
@root 好的,那很有效! - cs95
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接