我有一个最初创建以下数据框的 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() 或者今天日期的分配需要改变?
答案 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。