python+pandas指定日と再サンプリングを生成


python日付の範囲、周波数、再サンプリング、周波数変換
pandasには、標準時間シーケンス周波数と、再サンプリング、周波数推定、固定周波数日付範囲の生成に使用されるツールがセットされています.
指定した日付範囲の範囲を生成
pandas.date_range()は、指定された長さのDattimeIndexを生成するために使用されます.
1)デフォルトではdate_rangeは、所定の開始時間から終了時間までのタイムスタンプ配列を時間間隔で天として生成する.
2)開始時間または終了時間のみを指定する場合はperiods標定時間の長さも必要です.
import pandas as pd
pd.date_range('2017-6-20','2017-6-27')
    DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23',
                   '2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'],
                  dtype='datetime64[ns]', freq='D')

pd.date_range('2017-6-20 12:59:30','2017-6-27')
    DatetimeIndex(['2017-06-20 12:59:30', '2017-06-21 12:59:30',
                   '2017-06-22 12:59:30', '2017-06-23 12:59:30',
                   '2017-06-24 12:59:30', '2017-06-25 12:59:30',
                   '2017-06-26 12:59:30'],
                  dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-20 12:59:30',periods = 8)
    DatetimeIndex(['2017-06-20 12:59:30', '2017-06-21 12:59:30',
                   '2017-06-22 12:59:30', '2017-06-23 12:59:30',
                   '2017-06-24 12:59:30', '2017-06-25 12:59:30',
                   '2017-06-26 12:59:30', '2017-06-27 12:59:30'],
                  dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-20 12:59:30',periods = 8, normalize = True)
    DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23',
                   '2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'],
                  dtype='datetime64[ns]', freq='D')

頻度と日付オフセット
pandasにおける周波数は、1つのベース周波数(M,H)であってもよいし(Hour,Minute,h,min等)であってもよい
pd.date_range('2017-6-27',periods = 7,freq = '1h30min')
    DatetimeIndex(['2017-06-27 00:00:00', '2017-06-27 01:30:00',
                   '2017-06-27 03:00:00', '2017-06-27 04:30:00',
                   '2017-06-27 06:00:00', '2017-06-27 07:30:00',
                   '2017-06-27 09:00:00'],
                  dtype='datetime64[ns]', freq='90T')
pd.date_range('2017-6-27',periods = 7,freq = 'M')
    DatetimeIndex(['2017-06-30', '2017-07-31', '2017-08-31', '2017-09-30',
                   '2017-10-31', '2017-11-30', '2017-12-31'],
                  dtype='datetime64[ns]', freq='M')
pd.date_range('2017-6-27',periods = 7,freq = 'd')
    DatetimeIndex(['2017-06-27', '2017-06-28', '2017-06-29', '2017-06-30',
                   '2017-07-01', '2017-07-02', '2017-07-03'],
                  dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-27',periods = 7,freq = 'H')
    DatetimeIndex(['2017-06-27 00:00:00', '2017-06-27 01:00:00',
                   '2017-06-27 02:00:00', '2017-06-27 03:00:00',
                   '2017-06-27 04:00:00', '2017-06-27 05:00:00',
                   '2017-06-27 06:00:00'],
                  dtype='datetime64[ns]', freq='H')

一般的なベース周波数
別名#ベツメイ#
オフセット量
説明
D/d
Day
日めくり
B
BusinessDay
平日
H/h
Hour
毎時
Tまたはmin
Minute
毎分
S
Secend
毎秒
Lまたはms
Milli
ミリ秒あたり(1秒あたり千分)
U
Micro
マイクロ秒あたり
M
MonthEnd
毎月最後のカレンダー
BM
BusinessDayEnd
毎月最後の仕事
上の表には一部しか展示されていません!
WOM日付(「毎月第3金曜日」)
pd.date_range('2017-06-01','2017-07-31',freq='WOM-3FRI')
    DatetimeIndex(['2017-06-16', '2017-07-21'], dtype='datetime64[ns]', freq='WOM-3FRI')

再サンプリングおよび周波数変換
ダウンサンプリング:高周波データから低周波データへ
リフトサンプリング:低周波データから高周波データへ
主な関数:resample()(pandasオブジェクトにはこの方法があります)
resampleメソッドのパラメータ
パラメータ
説明
freq
「M」、「5 min」、「Second(15)」などの再サンプリング頻度を表す
how=’mean’
集約値を生成するための関数名または配列関数、例えば「mean」、「ohlc」、np.maxなど、デフォルトは「mean」であり、その他の一般的な値は「first」、「last」、「median」、「max」、「min」である
axis=0
デフォルトは縦軸、横軸設定axis=1
fill_method = None
リフトサンプリング時にどのように補間するか、例えば「ffill」、「bfill」など
closed = ‘right’
ダウンサンプリング時に、各期間のどのセグメントが閉じているか、「right」または「left」、デフォルト「right」
label= ‘right’
ダウンサンプリング時に集約値のラベルを設定する方法.たとえば、9:30-9:35に9:30または9:35とマークされます.デフォルトは9:35です.
loffset = None
メタラベルの時間補正値("-1 s"またはSecond(-1)など)は、集約ラベルを1秒前に調整するために使用されます.
limit=None
前または後のいずれかの充填時に許容される最大期間数
kind = None
期間(‘period’)またはタイムスタンプ(‘timestamp’)に集約し、デフォルトで時間系列に集約されるインデックスタイプ
convention = None
再サンプリング期間の場合、低周波数は高周波数で採用される規則(startまたはend)に変換される.デフォルト「end」
ダウンサンプリング
考慮事項:
1)各区間のどちらが閉じているか(パラメータ:closed)
2)各重合要素をどのようにマークするか,区間の先頭か末尾か(パラメータ:label)
ts_index = pd.date_range('2017-06-20',periods =12,freq = '1min')#       

ts = pd.Series(np.arange(12),index = ts_index)
ts
    2017-06-20 00:00:00     0
    2017-06-20 00:01:00     1
    2017-06-20 00:02:00     2
    2017-06-20 00:03:00     3
    2017-06-20 00:04:00     4
    2017-06-20 00:05:00     5
    2017-06-20 00:06:00     6
    2017-06-20 00:07:00     7
    2017-06-20 00:08:00     8
    2017-06-20 00:09:00     9
    2017-06-20 00:10:00    10
    2017-06-20 00:11:00    11
    Freq: T, dtype: int32

5分まで集約
ts.resample('5min',how='sum')
    C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated
    the new syntax is .resample(...).sum()
      if __name__ == '__main__':

    2017-06-20 00:00:00    10
    2017-06-20 00:05:00    35
    2017-06-20 00:10:00    21
    Freq: 5T, dtype: int32
ts.resample('5min',how='sum',closed='left')
    C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated
    the new syntax is .resample(...).sum()
      if __name__ == '__main__':

    2017-06-20 00:00:00    10
    2017-06-20 00:05:00    35
    2017-06-20 00:10:00    21
    Freq: 5T, dtype: int32
ts.resample('5min',how='sum',closed='left',label ='left')
    C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated
    the new syntax is .resample(...).sum()
      if __name__ == '__main__':

    2017-06-20 00:00:00    10
    2017-06-20 00:05:00    35
    2017-06-20 00:10:00    21
    Freq: 5T, dtype: int32

groupbyによる再挿入
もう1つのダウンサンプリング方法
ts1_index = pd.date_range('2017-6-01',periods = 100,freq = 'd')

ts1 = pd.Series(np.arange(100),index = ts1_index)
ts1.head()
    2017-06-01    0
    2017-06-02    1
    2017-06-03    2
    2017-06-04    3
    2017-06-05    4
    Freq: D, dtype: int32
ts1.groupby(lambda x:x.month).mean()
    6    14.5
    7    45.0
    8    76.0
    9    95.5
    dtype: float64
ts1.groupby(lambda x:x.weekday).mean()
    0    49.5
    1    50.5
    2    51.5
    3    49.0
    4    50.0
    5    47.5
    6    48.5
    dtype: float64
df1 = pd.DataFrame(np.arange(200).reshape(100,2),index = ts1_index)
df1.groupby(lambda x:x.weekday).mean()

0
1
0
99
100
1
101
102
2
103
104
3
98
99
4
100
101
5
95
96
6
97
98
時間シーケンスインデックスを持つpandasデータ構造では、groupbyが関数を入力すると、時間インデックス対応カラムを集約できます.
リフトサンプリング
アップサンプルは集約されていませんが、塗りつぶしが必要です.
df2 = pd.DataFrame(np.arange(200).reshape(100,2),index = ts1_index,columns=['add1','add2'])
df2.head()

add1
add2
2017-06-01
0
1
2017-06-02
2
3
2017-06-03
4
5
2017-06-04
6
7
2017-06-05
8
9
df2.resample('W-THU',fill_method = 'ffill')
    C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: fill_method is deprecated to .resample()
    the new syntax is .resample(...).ffill()
      if __name__ == '__main__':

add1
add2
2017-06-01
0
1
2017-06-08
14
15
2017-06-15
28
29
2017-06-22
42
43
2017-06-29
56
57
2017-07-06
70
71
2017-07-13
84
85
2017-07-20
98
99
2017-07-27
112
113
2017-08-03
126
127
2017-08-10
140
141
2017-08-17
154
155
2017-08-24
168
169
2017-08-31
182
183
2017-09-07
196
197
2017-09-14
198
199
まとめ
このブログの主な内容:
1)指定された期間を生成し、頻度を指定した日付
2)時間インデックスを含むpandasデータを再サンプリングし,ダウンサンプリングやアップサンプリングなどを含む.