首页 > 解决方案 > 如何防止在 numpy astype 中丢失纳秒

问题描述

当我遇到这种情况object时,datetime64[ns]会丢失纳秒。为什么会发生这种情况,如何解决?在 python 3.6 和 3.7 中相同的行为。

import numpy as np
import pandas as pd
a = np.ndarray(1, dtype=object)
a[0] = pd.Timestamp.max
print(a)
print(a.astype('datetime64[ns]'))

在输出中,我们可以看到纳秒被归零

[Timestamp('2262-04-11 23:47:16.854775807')]
['2262-04-11T23:47:16.854775000'] 

最初的问题来自熊猫数据框和这段代码:

df = pd.DataFrame(columns=['col'])
#df.loc[0] = [None]     # uncommenting this line makes nanoseconds being dropped
df.loc[0] = [pd.Timestamp.max]
print(df['col'].values.astype('datetime64[ns]'))

更新 Numpy 文档说纳秒仅支持[ 1678 AD, 2262 AD]. 但是对于范围内的日期时间值,该问题会重现:

import numpy as np
import pandas as pd
a = np.ndarray(1, dtype=object)
a[0] = pd.Timestamp(2020, 7, 31, 12, 12, 12, 123456, 789)
print(a)
print(a.astype('datetime64[ns]'))

在输出中,我们可以看到纳秒被归零

[Timestamp('2020-07-31 12:12:12.123456789')]
['2020-07-31T12:12:12.123456000'] 

标签: pythonpandasnumpy

解决方案


我无意中找到了解决方法。 fillna恢复纳秒!

df = pd.DataFrame(columns=['col'])
df.loc[0] = [None]
df.loc[0] = [pd.Timestamp(2020, 7, 31, 12, 12, 12, 123456, 789)]
print(df['col'].values.astype('datetime64[ns]'))
df['col'] = df['col'].fillna('')
print(df['col'].values.astype('datetime64[ns]'))

输出:

['2020-07-31T12:12:12.123456000'] 
['2020-07-31T12:12:12.123456789'] 


推荐阅读