我有很长一段时间的系列,从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
谢谢!
答案 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作为参考。