使用Pandas对数据帧上的特定时段进行下采样

时间:2017-08-16 23:53:08

标签: 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, 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  

谢谢!

3 个答案:

答案 0 :(得分:2)

为您的数据框提供正确的列名

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。但是,您有时间差并且必须解决空值并重新构建dtypes。

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

答案 1 :(得分:2)

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

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')

对于pandas> = 0.19:

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

答案 2 :(得分:2)

您最好先在数据框中添加日期时间列:
df['datetime'] = pd.to_datetime(df[['yr', 'mnth', 'd', 'h', 'm', 's']])

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

然后将datetime列设置为dataframe index:
data.set_index('datetime', inplace=True)

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

我在这里使用 mean 进行汇总。您可以根据需要使用其他方法。 请参阅Pandas document作为参考。