2017-11-09 10 views
0

別のデータフレームで定義された特定の日付のデータフレームの1つの列の値を合計します。日付のPythonの別のデータフレームの日付に基づく1つのデータフレームからの週単位の合計の合計

私の最初のデータフレームは、次のようになります。

import numpy as np 
import pandas as pd 

start_date = ["2-22-16 00:00:00", "2-29-16 00:00:00", "3-7-16 00:00:00", "3-14-16 00:00:00", "3-21-16 00:00:00", "3-28-16 00:00:00", "4-4-16 00:00:00", "4-11-16 00:00:00", "4-18-16 00:00:00", "4-25-16 00:00:00", "5-2-16 00:00:00", "5-9-16 00:00:00", "5-16-16 00:00:00", "5-23-16 00:00:00", "5-30-16 00:00:00", "6-6-16 00:00:00", "6-13-16 00:00:00", "6-20-16 00:00:00", "6-27-16 00:00:00", "7-4-16 00:00:00", "7-11-16 00:00:00", "7-18-16 00:00:00", "7-25-16 00:00:00", "8-08-16 00:00:00", "8-22-16 00:00:00", "8-29-16 00:00:00", "9-5-16 00:00:00", "9-12-16 00:00:00", "9-19-16 00:00:00", "9-26-16 00:00:00", "10-3-16 00:00:00", "10-10-16 00:00:00", "10-17-16 00:00:00", "10-24-16 00:00:00", "10-31-16 00:00:00", "11-7-16 00:00:00", "11-14-16 00:00:00", "11-21-16 00:00:00", "1-23-17 00:00:00", "1-30-17 00:00:00", "2-06-17 00:00:00", "3-13-17 00:00:00", "3-27-17 00:00:00", "6-19-17 00:00:00", "6-26-17 00:00:00"] 
start_date = [pd.to_datetime(d) for d in start_date] 
end_date = pd.DatetimeIndex(start_date) + pd.DateOffset(7) 
ndf = pd.DataFrame({'start':pd.to_datetime(start_date),'end':end_date}); ndf.head() 

は、私が欲しいのはndfで定義された週間以内に落ちる別のデータフレームからの値です。今、私はndfで日付の間に入るdfからすべてのvaluesを合計し、新たなデータフレームを作成したい

dates = ["4-17-16 04:00:00", "4-16-16 19:30:00", "4-16-16 19:00:00", "2-24-16 09:00:00", "3-21-16 02:00:00", "3-18-16 10:00:00", "3-24-16 05:00:00", "3-11-16 00:00:00"] 
df = pd.DataFrame(
    {'timestamp': dates, 
    'value': np.random.randint(1,25,size=(8,))}) 

:私の他のデータフレームは次のようになります。私もこれで遊ん

def get_dates(x): 
    # Select the df values between start and ending datetime. 
    n = df[(df['timestamp']>ndf['start'])&(df['timestamp']<ndf['end'])] 
    # Return sum of values 
    return n.values[0],n['value'].sum() 

n = df[(df['timestamp']>ndf['start'])&(df['timestamp']<ndf['end'])]だから私は、この関数を作成しました。しかし、私はエラー:ValueError: Can only compare identically-labeled Series objectsを取得します。

私は機能するように機能するように、上記のエラーメッセージの洞察を提供するために、私の機能を整理するのに役立つ人を探しています。ありがとう!日と終了日を開始し、あなたの特定のケースでは

+0

あなたは基本的に7day /週間間隔でグループしようとしているかのグループにあなたの必要性が等しくない日付の範囲(別の開始日と終了日の長さのチャンクがある時間帯)であります? – Jarad

+0

@Jaradグループ化は常に7日間ですが、これらは2016年から2017年までのすべての週には定期的ではありません。「dates」の最初の範囲は4-7-2016から11-21-2016までで、ジャンプ1-23-2017から3-27-2017まで、次に6-19-2017から6-26-2017にジャンプしてください。しかし、間隔は常に7日間です。 – JAG2024

答えて

1

使用resampleデータを等間隔の時間間隔でグループ化する必要があります。

df.set_index('timestamp').resample('w-mon', label='left').sum().reset_index() 

戻り値:

timestamp value 
0 2016-02-22 22.0 
1 2016-02-29 NaN 
2 2016-03-07 13.0 
3 2016-03-14 20.0 
4 2016-03-21 9.0 
5 2016-03-28 NaN 
6 2016-04-04 NaN 
7 2016-04-11 34.0 
+0

これは私のために働いた! – JAG2024

2

は一つの連続した期間を形成し、おそらくあなたは、このような何か使用するとよいでしょう:

def get_dates(): 
    # Select the df values between start and ending datetime. 
    n = df[(df['timestamp'] > ndf['start'].min()) & 
      (df['timestamp'] < ndf['end'].max())] 
    # Return sum of values 
    return n.values[0], n['value'].sum() 

をそして、あなたのエラーは、配列を比較しようとしていると言う要素長は異なる長さのです。 dfが持っているときあなたのndfは、45行を持っている1000年

編集: 両方のデータフレームを反復するよりも、不連続期間のきれいソリューションがあれば、私はわからない:

def get_dates(): 
    count = 0 
    for index, values_row in df.iterrows(): 
     for _, time_deltas_row in ndf.iterrows(): 
      if time_deltas_row['start'] < values_row['timestamp'] < time_deltas_row['end']: 
       count += 1 
       continue 
    return count 
+0

それは難しいです。私が実際に使っているデータセットは、1つの連続した時間ではありません。値は離散事象です。日付が連続しないように私の例を更新する必要がありますか? – JAG2024

+0

例@Georgyを更新しました。これはソリューションをより複雑にしますか? – JAG2024

+0

これにはかなりの解決策があるかどうかはわかりません。私が今考えることができるのは、両方のデータフレームを繰り返し処理することだけです。私は今更新を投稿します – Georgy

関連する問題