如何让pandas更新函数正确处理numpy.datetime64?

时间:2017-05-09 23:24:52

标签: pandas datetime numpy

我有一个数据框,其中包含可能包含None的列,另一个数据框具有相同的索引,其中填充了日期时间值。我正在尝试使用pandas.update更新第一个第一个。

import numpy as np
import pandas as pd

df = pd.DataFrame([{'id': 0, 'as_of_date': np.datetime64('2017-05-08')}])
print(df.as_of_date)
df2 = pd.DataFrame([{'id': 0, 'as_of_date': None}])
print(df2.as_of_date)
df2.update(df)
print(df2.as_of_date)
print(df2.apply(lambda x: x['as_of_date'] - np.timedelta64(1, 'D'), axis=1))

这导致

0   2017-05-08
Name: as_of_date, dtype: datetime64[ns]
0    None
Name: as_of_date, dtype: object
0    1494201600000000000
Name: as_of_date, dtype: object
0   -66582 days +10:33:31.122941
dtype: timedelta64[ns]

所以基本上update将日期时间转换为毫秒,但将类型保持为对象。然后,如果我尝试对它进行数据计算,我会得到古怪的结果,因为numpy不知道如何对待它。

我希望更新后df2看起来像df1。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

两步法

  1. 使用df中的日期填充df2中的无数据:

    df2 = df2.combine_first(df)

  2. 使用df

    中的元素更新df2中的所有元素

    df2.update(DF)

  3. 如果没有第二步,df2将仅从df中取值来填充其Nones。