Python 使用Pandas在数据帧上向下采样特定周期
我有一个很长的职业生涯,从1963年开始,到2013年结束。然而,从1963年到2007年,它有一个每小时的采样周期,而在2007年之后,采样率变为5分钟。是否有可能在2007年之后对数据进行重新采样,从而使整个时间序列每小时进行数据采样?下面是数据片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,
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的数据类型。