簡體   English   中英

滾動平均值與時間偏移熊貓

[英]Rolling Mean with Time Offset Pandas

我在熊貓中有一個時間戳和值的數據集。 在大約一年的總時間跨度內,時間戳之間的間隔約為 12 秒,但有時會丟失點(即,時間序列是不規則的,因此我無法使用固定的窗口大小)。

我想計算 1 分鍾間隔內值的滾動平均值,但我沒有得到預期的行為。 我在這里發現了一個類似的問題但這是使用 sum 和 pre-pandas 0.19.0。 我正在使用 Pandas 0.23.4。

樣本數據

Time, X
2018-02-02 21:27:00,    75.4356
2018-02-02 21:27:12,    78.29821
2018-02-02 21:27:24,    73.098345
2018-02-02 21:27:36,    78.3331
2018-02-02 21:28:00,    79.111

請注意,缺少2018-02-02 21:27:48

對於滾動總和,我可以只用 0 填充缺失值,但對於平均值,我不希望將缺失點計為實際數據點(例如,我希望窗口為總和(給定間隔內的數據點) ) / 間隔中的數據點數)。

我想在不同的時間段(即 1 分鍾、5 分鍾、15 分鍾、1 小時等)執行此操作。

我最接近獲得實際值的是:

代碼

df['rolling_avg']=df.rolling('1T',on='Time').X.mean()

我的理解是這將是 1 分鍾的滾動平均值。

但是,我不確定如何解釋輸出。 我本來希望在前 1+1 分鍾出現 NaN,因為沒有什么可作為滾動平均值的基礎,但我有值。

輸出

    Time                X         rolling_avg
0   2018-02-02 21:27:00 75.4356   75.435600
1   2018-02-02 21:27:12 78.29821  76.866905
2   2018-02-02 21:27:24 73.098345 75.610718
3   2018-02-02 21:27:36 78.3331   76.291314
4   2018-02-02 21:28:00 79.111    77.210164

基本上,在這個輸出中, df[1].rolling_avg(Value[0]+Value[1])/2 ,盡管間隔是 12 秒,而不是 1 分鍾。

有沒有辦法做我想做的事情,或者我是否需要編寫一個 for 循環來手動執行此操作?

我認為問題可能出在您的數據中。 然后也許我沒有解決問題。 使用您的數據時,我遇到了同樣的錯誤,但是當我嘗試執行此操作時,它可以正常工作。

import  pandas as pd
import numpy as np
import datetime

time = pd.date_range(start='1/1/2018', end='1/02/2018', freq='12s')
time

DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 00:00:12',
               '2018-01-01 00:00:24', '2018-01-01 00:00:36',
               '2018-01-01 00:00:48', '2018-01-01 00:01:00',
               '2018-01-01 00:01:12', '2018-01-01 00:01:24',
               '2018-01-01 00:01:36', '2018-01-01 00:01:48',
               ...
               '2018-01-01 23:58:12', '2018-01-01 23:58:24',
               '2018-01-01 23:58:36', '2018-01-01 23:58:48',
               '2018-01-01 23:59:00', '2018-01-01 23:59:12',
               '2018-01-01 23:59:24', '2018-01-01 23:59:36',
               '2018-01-01 23:59:48', '2018-01-02 00:00:00'],
              dtype='datetime64[ns]', length=7201, freq='12S')

B = np.random.randint(0, 9, 7201)

df = pd.DataFrame(B, time)
df['rolling_avg']=df.rolling('60s', min_periods=3).mean()
df.head(20)

    0                rolling_avg
2018-01-01 00:00:00 5   NaN
2018-01-01 00:00:12 0   NaN
2018-01-01 00:00:24 1   2.0
2018-01-01 00:00:36 0   1.5
2018-01-01 00:00:48 6   2.4
2018-01-01 00:01:00 7   2.8
2018-01-01 00:01:12 6   4.0
2018-01-01 00:01:24 3   4.4
2018-01-01 00:01:36 7   5.8
2018-01-01 00:01:48 6   5.8
2018-01-01 00:02:00 2   4.8
2018-01-01 00:02:12 6   4.8
2018-01-01 00:02:24 1   4.4
2018-01-01 00:02:36 0   3.0
2018-01-01 00:02:48 8   3.4
2018-01-01 00:03:00 2   3.4
2018-01-01 00:03:12 5   3.2
2018-01-01 00:03:24 8   4.6
2018-01-01 00:03:36 4   5.4
2018-01-01 00:03:48 1   4.0

你說:但是,我不確定如何解釋輸出。 我本來希望在前 1+1 分鍾出現 NaN,因為沒有什么可作為滾動平均值的基礎,但我有值。

方法.rolling()考慮索引在 1 分鍾間隔內的所有值。 間隔是( 默認情況下,但您可以更改此設置;使用可選參數closed )向左打開並向右關閉。 它的右端是當前索引( 您也可以更改它;使用可選參數center )。
在您的情況下,第一個這樣的間隔是 ] 2018-02-02 21:26:00 , 2018-02-02 21:27:00 ],其中僅包含索引2018-02-02 21:27:00 因此,平均值只計算一個值。

我希望這對你來說很有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM