python - 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
这是已知问题吗?
他们有任何已知的解决方法吗?
解决方案
正如评论中所解释的,这是一个已知问题(参见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
推荐阅读
- visual-studio-code - 如何在 VSCode 中从 WebStorm 导入设置
- node.js - webpack 4 使用 nodejs api - 不创建供应商块
- c# - 在.NET Core 中排除模型中的主键,因为 SQL 在 INSERT 时生成 PK
- functional-programming - 如何在 FP 中构造组件?
- javascript - Vue js 与 CDN 类型的 Javascript 文件集成
- node.js - 将 node_modules 文件夹放在单独的文件夹中
- apache - 无法从 apache solr 获取记录
- php - stdClass 无法转换为字符串
- firebase - 如何将验证码发送到电子邮件 ID
- python-3.x - RPLY - 具有多行代码的意外令牌解析源代码