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

Python:使用ffill()将数据帧从每日数据向每小时数据上采样,python,pandas,Python,Pandas,我正在尝试将我的数据从每日频率增加到每小时频率,并向前填充缺失的数据 我从以下代码开始: df1 = pd.read_csv("DATA.csv") df1.head(5) 然后,我使用以下命令转换为datetime字符串,并将日期/时间设置为索引: df1['DT'] = pd.to_datetime(df1['DT']).dt.strftime('%Y-%m-%d %H:%M:%S') df1.set_index('DT') 我尝试按如下方式每小时重新采样: df1['DT']

我正在尝试将我的数据从每日频率增加到每小时频率,并向前填充缺失的数据

我从以下代码开始:

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

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

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

我尝试按如下方式每小时重新采样:

df1['DT'] = df1.resample('H').ffill()
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
但我得到了以下错误:

TypeError:仅对DatetimeIndex、TimedeltaIndex或 PeriodIndex,但获得了“RangeIndex”的实例

我认为我的数据类型已经是上面pd.to_datetime代码指示的日期时间。我尝试的东西似乎都没用。有人能帮我吗

我的预期产出如下:

df1['DT'] = df1.resample('H').ffill()
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
等等。

尝试重新分配

df1=df1.set_index('DT')


我假设数据集的一些初始行如您所述

          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
输出:显示输出的一些初始值

                VALUE
    DT  
2016-08-01 00:00:00 0
2016-08-01 01:00:00 0
2016-08-01 02:00:00 0
2016-08-01 03:00:00 0
2016-08-01 04:00:00 0
2016-08-01 05:00:00 0
2016-08-01 06:00:00 0
2016-08-01 07:00:00 0
2016-08-01 08:00:00 0
2016-08-01 09:00:00 0
2016-08-01 10:00:00 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()

嗨,W-B,谢谢你的回答。我尝试了这个方法,但不幸的是,我仍然收到相同的错误。df1.VALUE.resample('H').ffill()是否有错误@GJBI现在获取问题AttributeError:'DataFrame'对象没有属性'VALUE'我的错误,我犯了一个错误:TypeError:仅对DatetimeIndex、TimedeltaIndex或PeriodIndex有效,但是得到了一个“RangeIndex”的实例,并提到了您的预期输出。@AbdurRehman谢谢您的评论,我已经更新了原始内容。在数据上提到
列名称以使其更清晰。您的实际数据为2018年,预期数据为2016年。输入正确还是错误?谢谢Abdur,我已经更新了列名。大约有3年的数据,前面大多是零。我已经在问题中澄清了。@GJB让我知道这对您有效,或者您有任何其他疑问。您好Abdur,我得到了以下错误:索引必须是单调递增或递减的。我发现了错误-数据的末尾有一个错误NaN。非常感谢Abdur。