2

次のような時系列インデックスを持つ不均一な〜secondlyデータがあります。

import numpy as np
import pandas as pd

dates = [pd.datetime(2012, 2, 5, 17,00,35,327000), pd.datetime(2012, 2, 5, 17,00,37,325000),pd.datetime(2012, 2, 5, 17,00,37,776000),pd.datetime(2012, 2, 5, 17,00,38,233000),pd.datetime(2012, 2, 5, 17,00,40,946000),pd.datetime(2012, 2, 5, 17,00,41,327000),pd.datetime(2012, 2, 5, 17,00,42,06000),pd.datetime(2012, 2, 5, 17,00,44,99000),pd.datetime(2012, 2, 5, 17,00,44,99000),pd.datetime(2012, 2, 5, 17,00,46,289000),pd.datetime(2012, 2, 5, 17,00,49,96000),pd.datetime(2012, 2, 5, 17,00,53,240000)]

inhomogeneous_secondish_series = pd.Series(np.random.randn(len(dates)), name='some_col', index=pd.DatetimeIndex(dates))

In [26]: inhomogeneous_secondish_series
Out[26]: 
2012-02-05 17:00:35.327000   -0.903398
2012-02-05 17:00:37.325000    0.535798
2012-02-05 17:00:37.776000    0.847231
2012-02-05 17:00:38.233000   -1.280244
2012-02-05 17:00:40.946000    1.330232
2012-02-05 17:00:41.327000    2.287555
2012-02-05 17:00:42.003072   -1.469432
2012-02-05 17:00:44.099000   -1.174953
2012-02-05 17:00:44.099000   -1.020135
2012-02-05 17:00:46.289000   -0.200043
2012-02-05 17:00:49.096000   -0.665699
2012-02-05 17:00:53.240000    0.748638
Name: some_col

これをリサンプリングして「5s」と言いたい。通常、私は次のことを行います。

In [28]: inhomogeneous_secondish_series.resample('5s')

これにより、0秒に固定された適切にリサンプリングされた5sデータが生成されます。結果として、インデックスの各アイテムは、指定された分の0秒から5秒の倍数になります。

2012-02-05 17:00:40   -0.200153
2012-02-05 17:00:45   -0.009347
2012-02-05 17:00:50   -0.432871
2012-02-05 17:00:55    0.748638
Freq: 5S

代わりに、リサンプリングされたデータを最新のサンプルの前後に固定して、インデックスを次のようにするにはどうすればよいでしょうか。

...
2012-02-05 17:00:38.240000  (some correct resample value)
2012-02-05 17:00:43.240000  (some correct resample value)
2012-02-05 17:00:48.240000  (some correct resample value)
2012-02-05 17:00:53.240000  (some correct resample value)
Freq: 5S

答えはおそらくresample()のloffsetパラメータにあると思いますが、リサンプリングの前にloffsetを計算するよりも簡単な方法があるかどうか疑問に思っています。最新のサンプルを見て、最も近い通常の5s周波数からのオフセットを把握し、それをloffsetにフィードする必要がありますか?

4

1 に答える 1

1

loffsetデータを新しい頻度にグループ化する方法を変更せずに、ラベルを変更するだけです。だからあなたの例を使用して:

max_date = max(dates)
offset = timedelta(seconds=(max_date.second % 5)-5
                , microseconds=max_date.microsecond-1)
inhomogeneous_secondish_series.resample('5s', loffset=offset)

あなたに与えるだろう:

2012-02-05 17:00:38.239999   -0.200153
2012-02-05 17:00:43.239999   -0.009347
2012-02-05 17:00:48.239999   -0.432871
2012-02-05 17:00:53.239999    0.748638
Freq: 5S

私が理解していることから、これはあなたが望むものではありません-最後の値は、最後の値だけでなく、データセットの最後の2つの値の平均でなければなりません。

周波数の固定方法を変更するには、を使用できますbase。ただし、これは整数である必要があるため、次のような適切なマイクロ秒周波数を使用する必要があります。

freq_base = (max_date.second % 5)*1000000 + max_date.microsecond
inhomogeneous_secondish_series.resample('5000000U', base=freq_base)
于 2012-12-04T17:50:04.437 に答える