2017-08-25 17 views
0

- 編集私は意図したように時間を入力していないことに気付きました。私は午後12時以降、24時間制のコンベンションに変換しました。しかし、unutbuの答えはまだ明らかです。指定した開始時刻の時間帯別パンダグループ

- 第2編集。私はより良い例を作るためにデータを変更しました。

以下は、日付で索引付けされた時系列です。私はstart_datetimeから集計を行い、以下のtimedelta(9.5時間= 34200秒)に従って集計を続けたいと思います。上記のコードを実行する

def main(): 

    # start_datetime = datetime.datetime(2013, 1, 1, 8) 
    # end_datetime = datetime.datetime(2013, 1, 1, 5, 30) 
    s = pd.Series(
     np.arange(2, 10), 
     pd.to_datetime([ 
      '20130101 7:34:04', '20130101 8:34:08', '20130101 10:34:08', 
      '20130101 12:34:15', '20130101 13:34:28', '20130101 12:34:54', 
      '20130101 14:34:55', '20130101 17:29:12'])) 

    print(s) 
    bar_size = datetime.timedelta(seconds=60*60*9.5) 
    time_group = pd.Grouper(
     freq=pd.Timedelta(bar_size), closed='left', label='right') 
    foobar = s.groupby(time_group).agg(np.sum) 
    print(foobar) 

if __name__ == "__main__": 
    main() 

出力以下になります。

2013-01-01 09:30:00  5 
2013-01-01 19:00:00 39 
Freq: 570T, dtype: int64 

パンダの内部には、午前8時の代わりに深夜からグループ化を開始することを決定しました。私は午前8時にデータフレームのグループ化を開始する方法を見つけることができません。誰もがパンダの機能を使用してソリューションを持っていますか?

答えて

4

使用base=480を押して開始点を480分(8時間)シフトします。ハタ周波数が570Tあるため 単位は(Tは、ここでは、分を意味する)分である:pd.Grouperは周波数、a TimeGrouper is returnedが与えられる

import datetime 
import pandas as pd 

def main(): 

    start_datetime = datetime.datetime(2013, 1, 1, 8) 
    s = pd.Series(
     range(8), 
     pd.to_datetime([ 
      '20130101 8:34:04', '20130101 10:34:08', '20130101 10:34:08', 
      '20130101 12:34:15', '20130101 1:34:28', '20130101 3:34:54', 
      '20130101 4:34:55', '20130101 5:29:12'])) 

    bar_size = datetime.timedelta(seconds=60*60*9.5) 
    time_group = pd.Grouper(freq=bar_size, closed='left', label='right', 
          base=480) 
    foobar = s.groupby(time_group).agg(sum) 
    print(foobar) 

if __name__ == "__main__": 
    main() 

収率内部

2013-01-01 08:00:00 22 
2013-01-01 17:30:00  6 
Freq: 570T, dtype: int64 

In [81]: time_group 
Out[81]: <pandas.core.resample.TimeGrouper at 0x7f1499a32198> 

したがって、引数pas pd.Grouperへのsedは実際にpd.TimeGrouperに渡されます。

In [82]: pd.TimeGrouper? 
Init signature: pd.TimeGrouper(self, freq='Min', closed=None, label=None, 
           how='mean', nperiods=None, axis=0, 
           fill_method=None, limit=None, loffset=None, 
           kind=None, convention=None, base=0, **kwargs) 

TimeGrouperドキュメントがbaseパラメータを説明していないが、それはdf.resampleと同じ意味を持っています

In [83]: df.resample? 
Parameters 
---------- 
base : int, default 0 
    For frequencies that evenly subdivide 1 day, the "origin" of the 
    aggregated intervals. For example, for '5min' frequency, base could 
    range from 0 through 4. Defaults to 0 
+0

偉大な答えを!ありがとうございました! – itzjustricky

0

次は、前方の日付に8時間の開始をスライドすることができます:あなたはそれから呼び出すことができます

(s.index + pd.Timedelta('9 hours 30 minutes')).strftime('%Y-%m-%d') 
# array([u'2013-01-01', u'2013-01-01', u'2013-01-01', u'2013-01-01', 
# u'2013-01-01', u'2013-01-01', u'2013-01-01', u'2013-01-01'], 
# dtype='<U10') 

を:

s.groupby((s.index + pd.Timedelta('9 hours 30 minutes')).strftime('%Y-%m-%d')).agg(sum) 
# 2013-01-01 28 

をあなたはまたあなたのためのパンダのdatetimeモジュールのみに依存することができます関数を別途インポートするのではなく、datetime

import pandas as pd 


def main(): 

    start_datetime = pd.datetime(2013, 1, 1, 8) 

    s = pd.Series(
     range(8), 
     pd.to_datetime([ 
      '20130101 8:34:04', '20130101 10:34:08', '20130101 10:34:08', 
      '20130101 12:34:15', '20130101 1:34:28', '20130101 3:34:54', 
      '20130101 4:34:55', '20130101 5:29:12'])) 

    time_group = (s.index + pd.Timedelta('9 hours 30 minutes')).strftime('%Y-%m-%d') 
    foobar = s.groupby(time_group).agg(sum) 
    print(foobar) 
関連する問題