Python 使用Pandas在数据帧上向下采样特定周期

Python 使用Pandas在数据帧上向下采样特定周期,python,pandas,dataframe,downsampling,Python,Pandas,Dataframe,Downsampling,我有一个很长的职业生涯,从1963年开始,到2013年结束。然而,从1963年到2007年,它有一个每小时的采样周期,而在2007年之后,采样率变为5分钟。是否有可能在2007年之后对数据进行重新采样,从而使整个时间序列每小时进行数据采样?下面是数据片 yr, m, d, h, m, s, sl 2007, 11, 30, 19, 0, 0, 2180 2007, 11, 30, 20, 0, 0, 2310 2007, 11, 30, 21, 0, 0, 2400 2007, 11, 30,

我有一个很长的职业生涯,从1963年开始,到2013年结束。然而,从1963年到2007年,它有一个每小时的采样周期,而在2007年之后,采样率变为5分钟。是否有可能在2007年之后对数据进行重新采样,从而使整个时间序列每小时进行数据采样?下面是数据片

yr, m, d, h, m, s, sl
2007, 11, 30, 19, 0, 0, 2180
2007, 11, 30, 20, 0, 0, 2310
2007, 11, 30, 21, 0, 0, 2400
2007, 11, 30, 22, 0, 0, 2400
2007, 11, 30, 23, 0, 0, 2270
2008, 1, 1, 0, 0, 0, 2210
2008, 1, 1, 0, 5, 0, 2210
2008, 1, 1, 0, 10, 0, 2210
2008, 1, 1, 0, 15, 0, 2200
2008, 1, 1, 0, 20, 0, 2200
2008, 1, 1, 0, 25, 0, 2200
2008, 1, 1, 0, 30, 0, 2200
2008, 1, 1, 0, 35, 0, 2200
2008, 1, 1, 0, 40, 0, 2200
2008, 1, 1, 0, 45, 0, 2200
2008, 1, 1, 0, 50, 0, 2200
2008, 1, 1, 0, 55, 0, 2200
2008, 1, 1, 1, 0, 0, 2190
2008, 1, 1, 1, 5, 0, 2190  

谢谢

为数据帧指定正确的列名

df.columns = 'year month day hour minute second sl'.split()
解决方案

df.groupby(['year', 'month', 'day', 'hour'], as_index=False).first()

   year  month  day  hour  minute  second    sl
0  2007     11   30    19       0       0  2180
1  2007     11   30    20       0       0  2310
2  2007     11   30    21       0       0  2400
3  2007     11   30    22       0       0  2400
4  2007     11   30    23       0       0  2270
5  2008      1    1     0       0       0  2210
6  2008      1    1     1       0       0  2190

选项2
下面是一个基于列重命名的选项。我们将使用
pd.to_datetime
巧妙地获取日期,然后使用
resample
。但是,您有时间间隔,必须处理空值并重新转换数据类型

df.set_index(
    pd.to_datetime(df.drop('sl', 1))
).resample('H').first().dropna().astype(df.dtypes)

                     year  month  day  hour  minute  second    sl
2007-11-30 19:00:00  2007     11   30    19       0       0  2180
2007-11-30 20:00:00  2007     11   30    20       0       0  2310
2007-11-30 21:00:00  2007     11   30    21       0       0  2400
2007-11-30 22:00:00  2007     11   30    22       0       0  2400
2007-11-30 23:00:00  2007     11   30    23       0       0  2270
2008-01-01 00:00:00  2008      1    1     0       0       0  2210
2008-01-01 01:00:00  2008      1    1     1       0       0  2190

为dataframe指定正确的列名

df.columns = 'year month day hour minute second sl'.split()
解决方案

df.groupby(['year', 'month', 'day', 'hour'], as_index=False).first()

   year  month  day  hour  minute  second    sl
0  2007     11   30    19       0       0  2180
1  2007     11   30    20       0       0  2310
2  2007     11   30    21       0       0  2400
3  2007     11   30    22       0       0  2400
4  2007     11   30    23       0       0  2270
5  2008      1    1     0       0       0  2210
6  2008      1    1     1       0       0  2190

选项2
下面是一个基于列重命名的选项。我们将使用
pd.to_datetime
巧妙地获取日期,然后使用
resample
。但是,您有时间间隔,必须处理空值并重新转换数据类型

df.set_index(
    pd.to_datetime(df.drop('sl', 1))
).resample('H').first().dropna().astype(df.dtypes)

                     year  month  day  hour  minute  second    sl
2007-11-30 19:00:00  2007     11   30    19       0       0  2180
2007-11-30 20:00:00  2007     11   30    20       0       0  2310
2007-11-30 21:00:00  2007     11   30    21       0       0  2400
2007-11-30 22:00:00  2007     11   30    22       0       0  2400
2007-11-30 23:00:00  2007     11   30    23       0       0  2270
2008-01-01 00:00:00  2008      1    1     0       0       0  2210
2008-01-01 01:00:00  2008      1    1     1       0       0  2190

为方便起见,重命名分钟列:

df.columns = ['yr', 'm', 'd', 'h', 'M', 's', 'sl']
创建日期时间列:

from datetime import datetime as dt
df['dt'] = df.apply(axis=1, func=lambda x: dt(x.yr, x.m, x.d, x.h, x.M, x.s))
重新采样:

对于小于0.19的熊猫:

df = df.set_index('dt').resample('60T').reset_index('dt')
对于大于等于0.19的熊猫:

df = df.resample('60T', on='dt')

为方便起见,重命名分钟列:

df.columns = ['yr', 'm', 'd', 'h', 'M', 's', 'sl']
创建日期时间列:

from datetime import datetime as dt
df['dt'] = df.apply(axis=1, func=lambda x: dt(x.yr, x.m, x.d, x.h, x.M, x.s))
重新采样:

对于小于0.19的熊猫:

df = df.set_index('dt').resample('60T').reset_index('dt')
对于大于等于0.19的熊猫:

df = df.resample('60T', on='dt')

您最好先在数据框中附加一个datetime列:
df['datetime']=pd.to_datetime(df['yr',mnth',d',h',m',s']])

但在此之前,您应该重命名月份列:
df.rename(columns={df.columns[1]:“mnth”})

然后将日期时间列设置为数据帧索引:
data.set\u索引('datetime',inplace=True)

现在,您可以通过首选采样率对上的数据帧应用重采样方法:
df.resample('60T',on='datatime').mean()

在这里,我使用平均值进行聚合。您可以根据需要使用其他方法。
请参见参考。

您最好先在数据框中附加一个datetime列:
df['datetime']=pd.to_datetime(df['yr',mnth',d',h',m',s']])

但在此之前,您应该重命名月份列:
df.rename(columns={df.columns[1]:“mnth”})

然后将日期时间列设置为数据帧索引:
data.set\u索引('datetime',inplace=True)

现在,您可以通过首选采样率对上的数据帧应用重采样方法:
df.resample('60T',on='datatime').mean()

在这里,我使用平均值进行聚合。您可以根据需要使用其他方法。
请参阅参考。

如果运行此命令,您将看到仍然需要处理来自nulls的浮点间隔和数据类型的Null。如果运行此命令,您将看到仍然需要处理来自nulls的浮点间隔和数据类型的Null。如果运行此命令,您将看到仍然需要处理来自nulls的浮点间隔和数据类型的Null如果你运行这个程序,你会发现你仍然需要处理来自间隙的空值和来自空值的float的数据类型。