2017-11-01 14 views
0

を使用して、比例毎日のデータに開始&終了データにより接着データをタグ付けされた私は、製品ごとに使用できないデータを使用している例を示します。グループは時給パンダDF

import pandas as pd 
import datetime as dt 
unavability = pd.DataFrame([[dt.datetime(2017, 10, 19,11), dt.datetime(2017, 10, 19,12),'broom'], 
         [dt.datetime(2017, 10, 19,9),dt.datetime(2017, 10, 19,10),'broom'], 
         [dt.datetime(2017, 10, 19,1), dt.datetime(2017, 10, 19,2),'bike'], 
         [dt.datetime(2017, 10, 19,22),dt.datetime(2017, 10, 20,3),'bike']], 
         columns=['start_date', 'end_date','product']) 
print unavability 
     start_date   end_date product 
0 2017-10-19 11:00:00 2017-10-19 12:00:00 broom 
1 2017-10-19 09:00:00 2017-10-19 10:00:00 broom 
2 2017-10-19 01:00:00 2017-10-19 02:00:00 bike 
3 2017-10-19 22:00:00 2017-10-20 03:00:00 bike 

は、私は、各日付&製品ごとに使用できない割合にグループにデータを探していますので、私は使用できない期間が続く場合でも、私はそれが仕事をしたいという心に留めておく、下記に上記Data Frameを変換したいです49時間以上(3日オーバーラップ)

desired=pd.DataFrame([[dt.datetime(2017, 10, 19),'broom',22/24.0],#2 houres of unavalability 
       [dt.datetime(2017, 10, 20),'broom',24/24.0], #Product fully available at that day 
       [dt.datetime(2017, 10, 19),'bike',22/24.0], # 2 hour of unavalability - from 22 to 24 
       [dt.datetime(2017, 10, 20),'bike',21/24.0]], # 3 hour of unavalability - from 00 to 3 
       columns=['date', 'product','avalability_proportion']) 
print desired 
     date product avalability_proportion 
0 2017-10-19 broom    0.916667 
1 2017-10-20 broom    1.000000 
2 2017-10-19 bike    0.916667 
3 2017-10-20 bike    0.875000 

タフ: ここで提案されているように、使用可能なすべての製品に対して理論的な時間を作成する変換を作成することを考えました。元のデータへの結合を作成します。それが賢いものならば。

これについての助けがあれば、前もって感謝しています。

答えて

1

私の愚かなソリューションと、これが役立つことを願っています。素敵な答えを

df = unavability 
# if date is changed, remember changed rows 
df['is_date_changed'] = df.start_date.dt.date != df.end_date.dt.date 
df.loc[df.is_date_changed,'intermediate_date'] = pd.to_datetime(df.end_date.dt.date) 
df_date_is_changed = df.loc[df.is_date_changed] 
df_date_not_changed = df.loc[~df.is_date_changed] 

# expand every changed row to two, 
# and append those rows to the date_not_changed dataframe. 
# for example, 
# 2017-10-19 22:00:00 2017-10-20 03:00:00 
# will be expand into two rows: 
# 2017-10-19 22:00:00 2017-10-20 00:00:00 
# 2017-10-20 00:00:00 2017-10-20 03:00:00 
for idx,row in df_date_is_changed.iterrows(): 
    row1 = [row['start_date'],row['intermediate_date'],row['product'],None,None] 
    df_date_not_changed.loc[-1] = row1 
    df_date_not_changed.index = df_date_not_changed.index + 1 
    row2 = [row['intermediate_date'],row['end_date'],row['product'],None,None] 
    df_date_not_changed.loc[-1] = row2 
    df_date_not_changed.index = df_date_not_changed.index + 1 

df = df_date_not_changed 
df['date'] = df.apply(
    lambda x:min(x['start_date'],x['end_date']), 
axis=1) 
df.date = df.date.dt.date 
df['time_delta'] = df.end_date - df.start_date 

df.groupby(['product','date']).agg({'time_delta':'sum'}) 
+0

おかげで、しかし私はその使用不能を持っている場合、何が起こるか、2次の日付のための2つのフレームにデータというあなたの分割に留意してください3日間続きますか? –

+0

さらに多くの行を追加できます。各行は1日を表します。しかし、おそらくそれは非常にばかに見えます。時間ウィンドウの重なりを考慮する必要があります。 – kingbase

+0

また、私は時間のデルタではなく、比の列が欲しいことに注意してください、私は時間の違いではなく、24時間の割合としてそれをしたいです:) –

関連する問題