Pandas重新采样不规则时间序列

4

我有一个时间序列,看起来像这样:

2018-10-12 00:00:00 1
2018-10-12 01:00:00 0
2018-10-12 02:00:00 0
2018-10-12 06:00:00 7
2018-10-12 07:00:00 22
2018-10-12 08:00:00 8
2018-10-12 09:00:00 18
2018-10-12 10:00:00 24
2018-10-12 11:00:00 8
2018-10-12 11:15:00 5
2018-10-12 11:30:00 4
2018-10-12 11:45:00 25
2018-10-12 12:00:00 29
2018-10-12 12:15:00 19
2018-10-12 12:30:00 24
2018-10-12 12:45:00 16
2018-10-12 13:00:00 49
2018-10-12 14:00:00 36
2018-10-12 15:00:00 27
2018-10-12 16:00:00 20
2018-10-12 17:00:00 8
2018-10-12 17:15:00 7
2018-10-12 17:30:00 8
2018-10-12 17:45:00 9
2018-10-12 18:00:00 10

我想重新采样它,以使其具有15分钟的时间间隔。

import pandas as pd

data = pd.read_csv("data.csv", sep=",", index_col=0, parse_dates=True)

data_resampled = data.resample("900s").sum()

这将产生以下结果:

2018-10-12 07:00:00 22
2018-10-12 07:15:00 0
2018-10-12 07:30:00 0
2018-10-12 07:45:00 0
2018-10-12 08:00:00 8
2018-10-12 08:15:00 0
2018-10-12 08:30:00 0
2018-10-12 08:45:00 0

但我想要的结果是:
2018-10-12 07:00:00 5,5
2018-10-12 07:15:00 5,5
2018-10-12 07:30:00 5,5
2018-10-12 07:45:00 5,5
2018-10-12 08:00:00 2
2018-10-12 08:15:00 2
2018-10-12 08:30:00 2
2018-10-12 08:45:00 2

最好像这样

2018-10-12 07:00:00 6
2018-10-12 07:15:00 5
2018-10-12 07:30:00 6
2018-10-12 07:45:00 5
2018-10-12 08:00:00 2
2018-10-12 08:15:00 2
2018-10-12 08:30:00 2
2018-10-12 08:45:00 2

但是我会接受类似于这样的东西:

2018-10-12 07:00:00 5
2018-10-12 07:15:00 5
2018-10-12 07:30:00 5
2018-10-12 07:45:00 5
2018-10-12 08:00:00 2
2018-10-12 08:15:00 2
2018-10-12 08:30:00 2
2018-10-12 08:45:00 2

如何进行重新取样,以便跨越多个新间隔的间隔在新的较小间隔内平均分配或接近平均分配?

3个回答

3
你可以在 resample.sum 中使用 min_count=1 将该15分钟间隔内的值转换为 NaN(如果之前没有值的话)。然后,你可以对每个组使用 groupby.transform,从存在值的位置开始进行分组(使用 notnacumsum 进行分组,如果一个值后面是 NaN,则它们将被分组在一起),并在使用 transform 时使用 mean 对 NaN 值进行填充为 0。
s_ = s.resample('15min').sum(min_count=1)
s_ = s_.fillna(0).groupby(s_.notna().cumsum()).transform('mean')

print (s_)
2018-10-12 00:00:00     0.25 #here it is 1 divided by 4
2018-10-12 00:15:00     0.25
2018-10-12 00:30:00     0.25
2018-10-12 00:45:00     0.25
2018-10-12 01:00:00     0.00
...
2018-10-12 07:00:00     5.50 #same here
2018-10-12 07:15:00     5.50
2018-10-12 07:30:00     5.50
2018-10-12 07:45:00     5.50
2018-10-12 08:00:00     2.00
...
2018-10-12 17:00:00     8.00 # here you keep the original value as existed before
2018-10-12 17:15:00     7.00 
2018-10-12 17:30:00     8.00
2018-10-12 17:45:00     9.00
2018-10-12 18:00:00    10.00
Freq: 15T, Name: val, dtype: float64

其中s将是一个系列:s=data['name_col_to_resample']


1

试试这个

import pandas as pd

data = pd.read_csv("data.csv", sep=",", index_col=0, parse_dates=True)
# just changing the column names
df.index.name='Datetime' 
df.columns = ['values']

# resample
df = df.resample('15min').sum().reset_index() # resample

# This will be used for the groupby
df['key'] = np.cumsum( (df['Datetime'].dt.minute == 0) | (df['values'] > 0) )

df['new_values'] = df.groupby(['key'])['values'].transform('mean')

df = df.drop(columns=['key'])

请注意,当您遇到以下情况时:

(保留HTML标记)
2018-10-12 08:00:00 10
2018-10-12 08:15:00 9
2018-10-12 08:30:00 0
2018-10-12 08:45:00 0

它将变成:
2018-10-12 08:00:00 10
2018-10-12 08:15:00 3
2018-10-12 08:30:00 3
2018-10-12 08:45:00 3

我不知道这是否是你想要的。

1
我会执行resample('H').sum(),然后执行asfreq('15Min'),最后执行groupby:
s = df.resample('H').sum().asfreq('15Min').fillna(0)
s.groupby(s.index.floor('H')).transform('mean')

输出(头):
                        1
0                        
2018-10-12 00:00:00  0.25
2018-10-12 00:15:00  0.25
2018-10-12 00:30:00  0.25
2018-10-12 00:45:00  0.25
2018-10-12 01:00:00  0.00

这种方法的问题在于,在那些实际上有15分钟间隔的情况下,比如12:00-13:00,这些差异也会被平滑掉,而我想保留这些差异。 - lshas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接