56210


以下のpythonのコードは、生産管理システムから取得したデータを「手順」「号機」で分類して  
作業時間を求めています。作業は３つの手順からなり、開始日時と終了日時の差分が作業時間になりますが、中断があるので累積させる必要があります。

やりたいことは以下２つです。  
１つ目：もっと高速に「手順」別、「号機」別の作業時間の算出と累積時間の算出はできないでしょうか？２重のforループとなっているのはあまりスマートではなさそうです。えらく時間がかかります。  
２つ目：画像のような横軸が号機、縦軸が手順でセルには累積時間をセットした表を作成したいのですが方法が分かりません。リスト内辞書を作って、DataFrameに出来るかなとも思ったのですが  
ここからが分かりませんでした。

[code]

    import pandas as pd
    from datetime import datetime
    
    DF=ps.DataFrame(columns=['手順名','状態','開始日時','終了日時','号機'])
    Items=[
        ['手順1','中断','2019-6-28 08:15:00','2019-6-28 08:16:00','1'],
        ['手順1','中断','2019-6-28 08:16:30','2019-6-28 08:17:30','1'],
        ['手順1','完成','2019-6-28 08:18:30','2019-6-28 08:19:30','1'],
        ['手順2','中断','2019-6-28 08:20:30','2019-6-28 08:21:30','1'],
        ['手順2','完成','2019-6-28 08:22:30','2019-6-28 08:23:30','1'],
        ['手順3','中断','2019-6-28 08:24:30','2019-6-28 08:25:30','1'],
        ['手順3','完成','2019-6-28 08:26:30','2019-6-28 08:27:30','1'],
        ['手順1','中断','2019-6-28 08:30:00','2019-6-28 08:31:00','2'],
        ['手順1','中断','2019-6-28 08:31:30','2019-6-28 08:32:30','2'],
        ['手順1','完成','2019-6-28 08:33:30','2019-6-28 08:34:30','2'],
        ['手順2','中断','2019-6-28 08:35:30','2019-6-28 08:36:30','2'],
        ['手順2','完成','2019-6-28 08:37:30','2019-6-28 08:38:30','2'],
        ['手順3','中断','2019-6-28 08:39:30','2019-6-28 08:40:30','2'],
        ['手順3','完成','2019-6-28 08:41:30','2019-6-28 08:42:30','2']
    ]
    for i,Dat in enumerate(Items[::-1]):
        DF.loc[i]=Dat
    
    list_手順と号機=[]
    
    for name,group in DF.groupby('手順名'):
        df_時間sort = group.sort_values(by=['開始日時'],ascending=[True])
        for name2,group2 in df_時間sort.groupby('号機'):
            group2['作業時間'] = pd.to_datetime(group2['終了日時'])-pd.to_datetime(group2['開始日時'])
            group2['累積時間'] = group2['作業時間'].cumsum()
            list_手順と号機.append({'手順名':name,'号機':name2,'時間':group2['累積時間'].max()})
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/noXIp.png)](https://i.stack.imgur.com/noXIp.png)  
画像のセル中の時間はあくまで例です。適当な値が入っています。


CC BY-SA 4.0
2019-06-28T14:42:08.610
56199
2019-06-29T05:46:26.587
2019-06-29T01:47:44.170
34450
34450
question
python pandas
pandas のデータ処理の高速化　と　表作成方法


`list_手順と号機=[]`以後の部分を以下に置き換えればプログラムはすっきりするでしょう。  
処理時間が速くなるか、については質問に提示されたプログラムがそのままではWindowsのPython3.7.3+pandas0.24.2で動作しなかったので分かりませんが、2重forループより少しは速くなるのではないでしょうか。

[code]

    DF = DF.sort_values(['号機','手順名','開始日時'])
    DFdelta = DF.assign(作業時間 = (pd.to_datetime(DF['終了日時']) - pd.to_datetime(DF['開始日時'])))
    DFsum = DFdelta.pivot_table(index=['手順名'], columns=['号機'], values=['作業時間'], aggfunc='sum')
    DFsum = DFsum.rename(columns={'作業時間': '累積時間'})
    DFsum = DFsum.rename_axis('手順', axis='index')
    
[/code]

処理後の`print(DFsum)`の表示は以下になります。

[code]

            累積時間
    号機         1        2
    手順
    手順1 00:03:00 00:03:00
    手順2 00:02:00 00:02:00
    手順3 00:02:00 00:02:00
    
[/code]

なお、`DF=ps.DataFrame`の **`ps`** は **`pd`** のtypoですね。


CC BY-SA 4.0
2019-06-29T04:09:06.437
56210
2019-06-29T05:46:26.587
2019-06-29T05:46:26.587
26370
26370
56199
answer