質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3326閲覧

Python+Pandas で表の結合

menshan

総合スコア54

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2016/02/11 06:18

出入口に設置したセンサーでIDカードを持った人の出入りの集計をしたいと思っています。
入力データは以下のような感じで1日の中で一番小さい時間を出勤時間、一番大きい時間を退勤時間としたいと思っています。

一日の最大、最小の集計はできたのですがこの2つを USER+DATE ごとに結合ができません。
どのようにしたらいいでしょうか?

import pandas as pd t1 = pd.DataFrame({ 'USER':[1,2,1,3,1,1,2], 'TIME':['2016-02-01 09:25','2016-02-01 09:59','2016-02-01 12:05','2016-02-01 09:55','2016-02-01 12:59','2016-02-01 18:01','2016-02-01 21:55'], 'ACTION':['IN','IN','OUT','IN','IN','OUT','OUT']}, index=[0,1,2,3,4,5,6], columns = ['USER','TIME','ACTION']) # 集計用に日単位キー追加 t1['DATE'] = t1['TIME'].str[0:10] # 出勤時間抽出 t2 = t1[t1['ACTION'] == 'IN'].groupby(['USER','DATE'])['USER','DATE','TIME'].min() # 退社時間抽出 t3 = t1[t1['ACTION'] == 'OUT'].groupby(['USER','DATE'])['USER','DATE','TIME'].max() # エラーになってしまう pd.merge(t2, t3, on=['USER', 'DATE'])

データの内容は以下のようになっています。

>>> t1 USER TIME ACTION DATE 0 1 2016-02-01 09:25 IN 2016-02-01 1 2 2016-02-01 09:59 IN 2016-02-01 2 1 2016-02-01 12:05 OUT 2016-02-01 3 3 2016-02-01 09:55 IN 2016-02-01 4 1 2016-02-01 12:59 IN 2016-02-01 5 1 2016-02-01 18:01 OUT 2016-02-01 6 2 2016-02-01 21:55 OUT 2016-02-01 >>> t2 TIME USER DATE 1 2016-02-01 2016-02-01 09:25 2 2016-02-01 2016-02-01 09:59 3 2016-02-01 2016-02-01 09:55 >>> t3 TIME USER DATE 1 2016-02-01 2016-02-01 18:01 2 2016-02-01 2016-02-01 21:55

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己レスです。
以下の様にしたら望む結果になりました。

python

1#インデックスのリセット 2>>> t2.reset_index(inplace=True) 3>>> t3.reset_index(inplace=True) 4 5#2つの表のキー指定結合 6>>> t4 = pd.merge(t2,t3, left_on=['USER','DATE'],right_on=['USER','DATE'],how='inner') 7>>> t4 8 USER DATE TIME_x TIME_y 90 1 2016-02-01 2016-02-01 09:25 2016-02-01 18:01 101 2 2016-02-01 2016-02-01 09:59 2016-02-01 21:55 11 12# 時間差分の計算 13>>> t4['DELTA'] = pd.to_datetime(t4['TIME_y'])-pd.to_datetime(t4['TIME_x']) 14>>> t4 15 USER DATE TIME_x TIME_y DELTA 160 1 2016-02-01 2016-02-01 09:25 2016-02-01 18:01 08:36:00 171 2 2016-02-01 2016-02-01 09:59 2016-02-01 21:55 11:56:00 18

回答頂いた方ありがとうございました。

追記です。こちらの方が普通のやりかたかも知れません。

python

1>>> t4 = pd.concat([t2, t3],axis=1,join='inner',keys=['x','y']) 2>>> t4 3 x y 4 TIME TIME 5USER DATE 61 2016-02-01 2016-02-01 09:25 2016-02-01 18:01 72 2016-02-01 2016-02-01 09:59 2016-02-01 21:55 8 9>>> t4['DELTA'] = pd.to_datetime(t4[('y','TIME')])-pd.to_datetime(t4[('x','TIME')]) 10>>> t4 11 x y DELTA 12 TIME TIME 13USER DATE 141 2016-02-01 2016-02-01 09:25 2016-02-01 18:01 08:36:00 152 2016-02-01 2016-02-01 09:59 2016-02-01 21:55 11:56:00 16

投稿2016/02/12 01:34

編集2016/02/12 05:58
menshan

総合スコア54

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この結果は欲しい結果でしょうか?

python

1import pandas as pd 2t1 = pd.DataFrame({ 3 'USER':[1,2,1,3,1,1,2], 4 'TIME':['2016-02-01 09:25','2016-02-01 09:59','2016-02-01 12:05','2016-02-01 09:55','2016-02-01 12:59','2016-02-01 18:01','2016-02-01 21:55'], 5 'ACTION':['IN','IN','OUT','IN','IN','OUT','OUT']}, 6 index=[0,1,2,3,4,5,6], 7 columns = ['USER','TIME','ACTION']) 8 9t1['DATE'] = t1['TIME'].str[0:10] 10t2 = t1[t1['ACTION'] == 'IN'].groupby(['USER','DATE'])['USER','DATE','TIME','ACTION'].min() 11t3 = t1[t1['ACTION'] == 'OUT'].groupby(['USER','DATE'])['USER','DATE','TIME','ACTION'].max() 12print pd.concat([t2, t3]) 13~
結果 ACTION TIME USER DATE 1 2016-02-01 IN 2016-02-01 09:25 2 2016-02-01 IN 2016-02-01 09:59 3 2016-02-01 IN 2016-02-01 09:55 1 2016-02-01 OUT 2016-02-01 18:01 2 2016-02-01 OUT 2016-02-01 21:55

投稿2016/02/11 07:23

K_S_

総合スコア419

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

menshan

2016/02/11 08:59

最終的には  OUT時間−IN時間 で滞在時間を集計し  日付 出勤時間 退勤時間 勤務時間数 という形式で出力したいと思っているのですが 上記形式だとどのように計算すればよろしいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問