python-3.x - 合并将时间戳转换为科学记数法并丢失精度
问题描述
原始时间戳 dtype int64
ts = datetime.fromtimestamp(1627741304932/1000)
print(ts)
2021-07-31 17:21:44.932000
合并数据帧后,时间戳丢失/增加 +-5 分钟,dtype 变为 float64
ts = datetime.fromtimestamp(1.627741e+12/1000)
print(ts)
2021-07-31 17:16:40
有没有办法避免这种转换或至少是精度损失?
除了放弃一万亿+并在合并后将其归还?
更新
我已经为我的问题创建了一个确切的例子:
例子
df1 = pd.DataFrame({'col1': ['ts1', 'ts2', 'ts3', 'ts4'],
'col2': [1627741304932, 1627741304931, 1627741304930, 1627741304929]})
df2 = pd.DataFrame({'col1': ['ts1', 'ts2', 'ts3', 'ts5'],
'col2': [1627741305932, 1627741304931, 1627741304930, 1627741304920]})
x = df1.merge(df2, on='col1', how='outer', suffixes=('_prev', '_new'))
print(x)
print(x.dtypes)
输出
这是因为在合并期间添加到数据框的 NaN 值
col1 col2_prev col2_new
0 ts1 1.627741e+12 1.627741e+12
1 ts2 1.627741e+12 1.627741e+12
2 ts3 1.627741e+12 1.627741e+12
3 ts4 1.627741e+12 NaN
4 ts5 NaN 1.627741e+12
col1 object
col2_prev float64
col2_new float64
dtype: object
我怎样才能解决这个问题?
解决方案
因此,问题似乎归结为熊猫将时间戳从 int 转换为 float。这是因为“int64”数据类型不支持 NaN 值。
为了克服这个问题,我们可以使用Nullable 整数数据类型:
例如:
df1 = pd.DataFrame({'col1': ['ts1', 'ts2', 'ts3', 'ts4'],
'col2': [1627741304932, 1627741304931, 1627741304930, 1627741304929]})
df2 = pd.DataFrame({'col1': ['ts1', 'ts2', 'ts3', 'ts5'],
'col2': [1627741305932, 1627741304931, 1627741304930, 1627741304920]})
# allow NaN values (notice the capital I)
df1['col2'] =df1['col2'].astype('Int64')
df2['col2'] =df2['col2'].astype('Int64')
x = df1.merge(df2, on='col1', how='outer', suffixes=('_prev', '_new'))
print(x)
print(x.dtypes)
输出:
col1 col2_prev col2_new
0 ts1 1627741304932 1627741305932
1 ts2 1627741304931 1627741304931
2 ts3 1627741304930 1627741304930
3 ts4 1627741304929 <NA>
4 ts5 <NA> 1627741304920
col1 object
col2_prev Int64
col2_new Int64
dtype: object
推荐阅读
- javascript - jQuery Trigger Click 在第一次点击时不起作用
- angular - Angular 6 动画中的 window.innerHeight 不起作用
- php - 用 PHP 迭代 POST 数据给了我愚蠢的结果
- html - HTML5 画布扫描渐变
- java - JSONMANAGED 参考的问题
- node.js - 如何使用 node.js 读取子目录中的文件?
- reactjs - 使用 React 的 Div 表排序控制/排序
- scikit-learn - 使用 CV 进行递归特征消除不会减少特征数
- c# - 从 DbSet 获取所有实体
具有 IEnumerable 中的属性值 - c# - 将 C# 解决方案结构转储到文本文件