Python:使用ffill()从每日数据到每小时数据上采样数据帧

时间:2019-01-02 17:47:43

标签: python pandas

我正在尝试从每天到每小时的频率上采样我的数据,并向前填充丢失的数据。

我从以下代码开始:

df1 = pd.read_csv("DATA.csv")   
df1.head(5)

Header

然后我使用以下代码转换为日期时间字符串,并将日期/时间设置为索引:

df1['DT'] = pd.to_datetime(df1['DT']).dt.strftime('%Y-%m-%d %H:%M:%S')
df1.set_index('DT')

enter image description here

我尝试每小时重新采样一次,如下所示:

df1['DT'] = df1.resample('H').ffill()

但是出现以下错误:

  

TypeError:仅与DatetimeIndex,TimedeltaIndex或   PeriodIndex,但有一个'RangeIndex'实例

我认为我的dtype已经是上面pd.to_datetime代码所指示的日期时间。我尝试的一切似乎都没有效果。谁能帮我吗?

我的预期输出如下:

DT                  VALUE
2016-08-01 00:00:00 0.000000
2016-08-01 01:00:00 0.000000
2016-08-01 02:00:00 0.000000

文件本身大约有1000行。前50列左右为零,以澄清实际数据在哪里:

DT                  VALUE
2018-12-13 00:00:00 24000.000000
2018-12-13 01:00:00 24000.000000
2018-12-13 02:00:00 24000.000000
...
2018-12-13 23:00:00 24000.000000
2018-12-14 00:00:00 26000.000000
2018-12-14 01:00:00 26000.000000

3 个答案:

答案 0 :(得分:0)

尝试将其分配回

df1=df1.set_index('DT')

df1.set_index('DT',inplace=True)

答案 1 :(得分:0)

我假设您提到过数据集的一些初始行,

module.exports = mongoose.model('Company', CompanySchema);
module.exports = mongoose.model('CompanyWarehouses', CompanyWarehouses);

然后像这样在 DT VALUE 0 2016-08-01 0 1 2016-08-02 0 2 2016-08-03 0 3 2016-08-04 0 4 2016-08-05 0 5 2016-08-06 0 6 2016-08-07 0 7 2016-08-08 0 8 2016-08-09 0 上建立索引,

DT

输出:

df = df.set_index('DT')
df

现在,重新采样数据框,

           VALUE
   DT   
2016-08-01  0
2016-08-02  0
2016-08-03  0
2016-08-04  0
2016-08-05  0
2016-08-06  0
2016-08-07  0
2016-08-08  0
2016-08-09  0

输出:显示输出的一些初始值,

df = df.resample('H').ffill()
df

答案 2 :(得分:0)

您可以将索引转换为pd.DatetimeIndex,然后对其重新采样。我也不认为您需要(或想要)strftime()通话:

df1 = pd.read_csv("DATA.csv")
df1['DT'] = pd.to_datetime(df1['DT'])
df1.set_index('DT')
df1.index = pd.DatetimeIndex(df1.index)
df1['DT'] = df1.resample('H').ffill()

注意:您可能可以将其中的一些结合起来,但仍然很清楚,例如:

df1 = pd.read_csv("DATA.csv")
df1.index = pd.DatetimeIndex(pd.to_datetime(df1['DT']))
df1['DT'] = df1.resample('H').ffill()