熊猫:对时间序列数据进行去季节化

时间:2014-06-29 13:42:39

标签: python pandas

我有以下数据框df

[OUT]:

                     VOL
2011-04-01 09:30:00  11297
2011-04-01 09:30:10  6526
2011-04-01 09:30:20  14021
2011-04-01 09:30:30  19472
2011-04-01 09:30:40  7602
...
2011-04-29 15:59:30  79855
2011-04-29 15:59:40  83050
2011-04-29 15:59:50  602014

df包括每22秒进行22次非连续日的体积观测。我想通过将每个观察值除以它们各自的5分钟时间间隔的平均音量来对我的时间序列进行去季节化。为此,我需要在22天内每5分钟采用一次时间序列的平均值。所以我最终会在每5分钟9:30:00 - 9:35:00; 9:35:00 - 9:40:00; 9:40:00 - 9:45:00 ...到16:00:00之间得到一个平均时间序列。区间9:30:00 - 9:35:00的平均值是所有22天内此时间间隔的平均值(即所以9:30:00到9:35:00之间的平均值是9:30:00之间的总量到9点35分(第1天+第2天+第3天......第22天)/ 22.这有意义吗?)。然后,我会将df9:30:00 - 9:35:00之间的每个观察值除以此时间间隔的平均值。

Python / Pandas中是否有可以执行此操作的程序包?

1 个答案:

答案 0 :(得分:4)

编辑回答:

date_times = pd.date_range(datetime.datetime(2011, 4, 1, 9, 30),
                           datetime.datetime(2011, 4, 16, 0, 0),
                           freq='10s')
VOL = np.random.sample(date_times.size) * 10000.0

df = pd.DataFrame(data={'VOL': VOL,'time':date_times}, index=date_times)
df['h'] = df.index.hour
df['m'] = df.index.minute
df1 = df.resample('5Min', how={'VOL': np.mean})
times = pd.to_datetime(df1.index)
df2 = df1.groupby([times.hour,times.minute]).VOL.mean().reset_index()
df2.columns = ['h','m','VOL']
df.merge(df2,on=['h','m'])
df_norm = df.merge(df2,on=['h','m'])
df_norm['norm'] = df_norm['VOL_x']/df_norm['VOL_y']

**旧答案(暂时保留)

使用重新采样功能

df.resample('5Min', how={'VOL': np.mean})

例如:

date_times = pd.date_range(datetime.datetime(2011, 4, 1, 9, 30),
                           datetime.datetime(2011, 4, 16, 0, 0),
                           freq='10s')
VOL = np.random.sample(date_times.size) * 10000.0

df = pd.DataFrame(data={'VOL': VOL}, index=date_times)
df.resample('5Min', how={'VOL': np.mean})