【问题标题】:How to fill missing dates with corresponding NaN in other columns如何在其他列中用相应的 NaN 填充缺失的日期
【发布时间】:2021-08-11 08:39:52
【问题描述】:

我有一个最初创建以下数据框的 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() 是否有替代方法,或者今天日期的分配可能需要更改?

【问题讨论】:

标签: python pandas


【解决方案1】:

Pandas 有用于 datetimeIndex 的 asfreq 函数,这基本上只是对 reindex() 的一个轻薄但方便的包装器,它生成一个 date_range 并调用 reindex。

代码

df.Date = pd.to_datetime(df.Date)
df = df.set_index('Date').asfreq('D').reset_index()

输出

    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

【讨论】:

  • 这就像一个魅力!非常感谢您的帮助:)
  • 谢谢,声望达到15分我会打勾的。
  • 我刚刚更新了原始问题,因为有一点后续问题。有人知道我该如何继续吗?
  • 您能否针对该问题打开一个单独的问题,请提供示例输入、示例输出和错误堆栈跟踪以及您在问题中的代码。如果您愿意,您可以将此问题链接到新问题。
【解决方案2】:

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()

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

【讨论】:

  • 对于此解决方案,我收到以下错误:TypeError: '
  • 好吧,我想我(错误地假设)您使用 pd.Timedelta 类型,而 Date 的类型在您的情况下实际上是字符串。您应该首先将其解析为不同的类型:pandas.pydata.org/docs/reference/api/pandas.to_datetime.html
  • 谢谢,我会研究一下,把它转换成日期时间格式。但是,我认为通过使用 date = datetime.date(datetime.now()) 我会有这样的格式?
  • 这是另一种可能性,但我不确定您是否真的以这种方式更改日期:仔细检查类型是否确实已更改
猜你喜欢
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多