2015-02-11 71 views
2

我有Pandas DataFrame(从.csv加载),日期时间作为索引..每天有/必须有一个条目。 问题是我有空隙,即有几天我根本没有数据。 插入行(天)的最简单方法是什么?还有一种方法可以控制将数据插入列中作为数据!说0或复制prev day info或填充从prev-date到next-date数据值范围内的滑动增加/减少值。熊猫数据框的填充日期间隙

感谢

我这里是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) 

和然后重新采样...原因是导入带有header-col-name Date的.csv实际上并不是创建日期时间索引,但冻结列表无论如何。 重采样()期待:如果isinstance(斧,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 

我不得不修复的日期列,因为重采样()只是让你去填充它。 虽然它修正了索引,所以我可以用它来修复日期列。

在这里被修正后剪断的数据的:

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”,索引的级别也是如此)。 – 2015-02-12 01:41:12

+0

我可以在cvs导入时做到这一点(pd.read_csv()) – user1019129 2015-02-12 02:35:52

+0

是的,'parse_dates = True'可以做到这一点。 – 2015-02-12 05:45:13

回答

6

您可以在一天内重新采样

df.resample('D', how='mean') 

然后,您可以ffill,以取代前几天的结果NaN的:如果每天有多个条目使用的意思。

请参阅文档中的up and down sampling

+0

现在你已经用ohlc更新了,我不确定你是否可以在已经是ohlc的DataFrame上得到怎样='ohlc'(尽管存在问题),你可以单独重新采样每个列(即high = how'='最高',低如何='最低',率如何='平均')。那就是如果你一天有多个参赛作品,如果你不是很好。 – 2015-02-11 23:50:35

+0

谢谢..我得到:TypeError:只对DatetimeIndex,TimedeltaIndex或PeriodIndex有效?当我尝试它... df.index.names给出:FrozenList([u'Date']),如果它意味着什么.. – user1019129 2015-02-12 00:58:32

+2

@ user1019129你的索引不是DatetimeIndex,你可以通过'df.index = pd.to_datetime(df.index)'来完成。 – 2015-02-12 01:38:43