如何在其他列中使用相应的 NaN 填充缺失的日期

时间:2021-05-22 10:23:23

标签: python pandas

我有一个最初创建以下数据框的 CSV:

    Date        Portfoliovalue
0   2021-05-01  50000.0
1   2021-05-05  52304.0

使用以下脚本,我想用 NaN 填充缺失的日期并在 Portfoliovalue 列中具有相应的 NaN 值。所以结果是这样的:

    Date        Portfoliovalue
0   2021-05-01  50000.0
1   2021-05-02  NaN
2   2021-05-03  NaN
3   2021-05-04  NaN
4   2021-05-05  52304.0

我首先在这里尝试了该方法:Fill the missing date values in a Pandas Dataframe column

但是 bfill 替换了我所有的 NaN 并且删除它只会返回一个错误。

到目前为止,我已经尝试过:

df = pd.read_csv("Tickers_test5.csv")
df2 = pd.read_csv("Portfoliovalues.csv")

portfolio_value = df['Currentvalue'].sum()
portfolio_value = portfolio_value + cash

date = datetime.date(datetime.now())

df2.loc[len(df2)] = [date, portfolio_value]

print(df2.asfreq('D'))

然而,这只会返回:

            Date    Portfoliovalue
1970-01-01  NaN     NaN

感谢您的帮助。这个社区的帮助给我留下了深刻的印象。


快速更新:

我已经添加了代码,以便它填补我遗漏的日期。但是,它是一个程序的一部分,该程序每次启动时都会尝试更新缺少的日期。所以当我执行代码并且没有丢失日期时,我收到以下错误:

<块引用>

ValueError: 无法从重复的轴重新索引”

代码如下:

df2 = pd.read_csv("Portfoliovalues.csv")


portfolio_value = df['Currentvalue'].sum()

date = datetime.date(datetime.now())


df2.loc[date, 'Portfoliovalue'] = portfolio_value

#Solution provided by Uts after asking on Stackoverflow
df2.Date = pd.to_datetime(df2.Date)
df2 = df2.set_index('Date').asfreq('D').reset_index()

因此,代码添加了重复的日期,然后导致 .reindex() 函数引发 ValueError。但是,我不确定如何继续。有没有替代 .reindex() 或者今天日期的分配需要改变?

1 个答案:

答案 0 :(得分:1)

Pandas 有 reindex 方法:给定一个索引列表,它只保留列表中的索引。

在您的情况下,您可以创建您想要的所有日期,例如通过 date_range,然后将其提供给 reindex。您可能需要一个简单的 set_index 和 reset_index,但我认为您不太关心原始索引。

示例:

df.set_index('Date').reindex(pd.date_range(start=df['Date'].min(), end=df['Date'].max(), freq='D')).reset_index()

首先我们将“日期”列设置为索引。然后我们使用 reindex,它的完整日期列表(由 date_range 给出,从“日期”列中的最小日期到最大日期,每日频率)作为新索引。它会在没有以前价值的地方产生 nans。