在 Pandas 数据框中填充日期间隔

11

我有一个Pandas数据框(从.csv文件加载),其中日期时间是索引,每天应该有一个条目。问题在于我有空缺,即有些日期没有任何数据。最简单的方法是什么来在这些空缺中插入行(日期)?此外,是否有一种方法可以控制插入到列中的数据!比如0或复制前一天的信息,或者填充滑动递增/递减值,范围从前一日期向下一个日期数据值。

谢谢

这里有一个例子:01-03和01-04丢失了:

In [60]: df['2015-01-06':'2015-01-01']
Out[60]: 
           Rate  High (est)  Low (est)
Date                                      
2015-01-06  1.19643      0.0000     0.0000
2015-01-05  1.20368      1.2186     1.1889
2015-01-02  1.21163      1.2254     1.1980
2015-01-01  1.21469      1.2282     1.2014

仍在试验,但这似乎解决了问题:

df.set_index(pd.DatetimeIndex(df.Date),inplace=True)

然后重新采样...原因是使用具有标题列名称"Date"的.csv文件实际上并没有创建日期时间索引,但是创建了冻结列表,不知道这是什么意思。

resample()方法期望: if isinstance(ax, DatetimeIndex): ......


这是我的最终解决方案:

  #make dates the index
  self.df.set_index(pd.DatetimeIndex(self.df.Date), inplace=True)
  #fill the gaps
  self.df = self.df.resample('D',fill_method='pad')
  #fix the Date column
  self.df.Date = self.df.index.values

我必须修复日期列,因为resample()只允许您填充它。

尽管如此,它可以正确地修复索引,因此我可以使用它来修复日期列。

以下是纠正后的数据片段:

2015-01-29 2015-01-29  1.13262      0.0000     0.0000
2015-01-30 2015-01-30  1.13161      1.1450     1.1184
2015-01-31 2015-01-31  1.13161      1.1450     1.1184
2015-02-01 2015-02-01  1.13161      1.1450     1.1184

01-30和01-31是新生成的数据。


1
df.index 应该是一个“DatetimeIndex”,我推荐使用 pd.to_datetime 而不是 pd.DatetimeIndex 构造函数。df.index.names 是“索引标题”(列被标记为例如“Rate”,所以可以层次化地命名索引)。 - Andy Hayden
我可以在 CVS 导入 (pd.read_csv()) 过程中这样做吗? - sten
是的,parse_dates=True 可能会起到作用。 - Andy Hayden
你的第一个例子表明01/03和01/04缺失了,但你的“纠正后数据”显示了一个完全不同的范围,宣称1/30和1/31是新生成的。看起来你想要展示相同的时间段之前和之后的情况。 - nategood
更新:fill_method="pad" 已不再使用,请改用 .resample(...).pad() - Manto
1个回答

14

如果每天有多个数据点,您可以按天重新采样,例如使用平均值:

df.resample('D', how='mean')
你可以使用ffill来用前一天的结果替换NaN值。
请参阅文档中的上采样和下采样

现在你已经使用了OHLC更新,我不确定你是否可以在已经是OHLC数据帧上使用how='ohlc'(虽然有一个相关问题),但你可以单独重新采样每一列(例如,高价使用how='max',低价使用how='min',利率使用how='mean')。如果你的一天内有多个条目,那就是这样处理,如果没有,那就很好。 - Andy Hayden
谢谢。当我尝试时,出现了“TypeError:仅适用于DatetimeIndex、TimedeltaIndex或PeriodIndex”??... df.index.names返回:FrozenList([u'Date']),如果它有意义的话... - sten
2
@user1019129,你的索引不是 DatetimeIndex 类型,你可以使用 df.index = pd.to_datetime(df.index) 将其转换为该类型。 - Andy Hayden
1
相关。我想填补每天的空缺,并将它们解释为0(例如,那一天没有数据可收集)。fillna可以解决这个问题。 df2 = df.resample('D', how='mean').fillna(0) - nategood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接