[英]Pandas resampling irregular time series
我有一個看起來像這樣的時間序列:
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
如何重新采樣,以便跨越多個新間隔的間隔被均分,或者在新的較小間隔中接近相等?
您可以做的是在resample.sum
中並使用min_count=1
將值設置為 NaN 如果之前這 15 分鍾間隔沒有值。 然后您可以groupby.transform
每組從notna
和cumsum
存在的值開始(如果一個值后面跟着 nan 則它們被分組在一起),並在轉換中使用mean
與fillna
之前為 0 的 nan。
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']
我會做resample('H').sum()
,然后做一個asfreq('15Min')
,然后是groupby
:
s = df.resample('H').sum().asfreq('15Min').fillna(0)
s.groupby(s.index.floor('H')).transform('mean')
Output(頭):
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
嘗試這個
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'])
請注意,當您遇到以下情況時
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
我不知道這是否是你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.