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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

157閲覧

データフレームに記載された情報をもとに時間を計算したい:Python(Pandas)

pepasuke623

総合スコア55

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2017/10/14 00:20

編集2017/10/14 00:23

###前提・実現したいこと
お世話になります。

「ある地点からある地点までかかった時間を人ごとに出力したい」ということをしたいです。

具体的にはこんな感じです

  • xさん、yさん、zさんの三人がいて、地点A,B,Cを通過する、という問題を考える
  • 地点A,B,Cにはそれぞれ防犯カメラが置いてあって、画像認識技術を使ってxさん、yさん、zさんをそれぞれ認識できる- 防犯カメラは映っている人数が変わった瞬間、変化後の「映っている人」と「その時の時間」を記録する。たとえば[xさん、yさん、zさん]からzさんが撮像範囲から出て[xさん、yさん]が映った状態に変化したときは、zさんが出た時間とその後の写っている人[xさん、yさん]を記録する
  • 誰もいなくなったら「空白」と記録する
  • このときにxさん、yさん、zさんごとに出ていった「地点Aを去ってから地点Bを去るまでの時間」「地点Bを去ってから地点Cを去るまでの時間」を計算したい

具体的にはこんなデータがあるとします

time,point,detection 10:00:00,A,x 10:00:00,A,y 10:00:00,A,z 10:00:05,A,x 10:00:05,A,y 10:00:07,A,x 10:01:06,A, 10:01:05,B,z 10:01:05,B,y 10:01:08,B,x 10:01:08,B,y 10:01:08,B,z 10:01:45,B,y 10:01:45,B,z 10:01:55,B,y 10:02:01,B, 10:02:10,C,x 10:02:22,C,x 10:02:22,C,y 10:02:50,C,x 10:02:50,C,y 10:02:50,C,z 10:03:01,C,x 10:03:01,C,y 10:03:02,C,x 10:03:09,C,

データのルールとしては

  • time列は撮像された人が変化した時間を記録している。(「10:00:00」にカメラを起動したとする)
  • point列は地点A,B,Cのいずれかの地点で撮像されたかを記録している
  • detection列は変化した瞬間に映っていた人を記録している。誰もいなければ空欄で表示している
  • 「10:00:00」の時点でカメラが起動し、xさん、yさん、zさんが映っているので、行を換えて三人分を記録している。
  • 「10:00:05」の時点でzさんが抜けたので、この時点で写っているxさん、yさんを記録している。
  • 「10:01:05」の時点で地点Bで「xさん、yさん」が同時に映り込んだので、二人分記録している。

最終的には前回質問させていただいた積み上げ式の棒グラフで示したいと思っていますので、次のように出力できればと思っています。

//最終型(時間は適当に入れています) ,A-B,B-C x,0:00,0:00 y,0:00,0:00 z,0:00,0:00

Forループを駆使すれば出来なくは無いですが、Pythonらしいテクニック使って出来れば、と思っています。

Pandasを使ってマルチスタックやグルーピングなどもやってみましたが,上手く行きませんでした。
(ひどいコードなのでお見せできません・・・)

自分で試してみたことなどを提示出来ていませんが、ぜひともお知恵を借りられればと思います。

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

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

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

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

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

guest

回答2

0

ベストアンサー

とりあえず書いてみました。
途中の Column毎のloopがちょっと気になりますが・・

Python

1import pandas as pd 2import numpy as np 3 4df = pd.read_csv('data.csv', parse_dates=['time']) 5 6df = df.pivot(index='time', columns='detection', values='point').drop(np.NaN, axis=1) 7 8df2 = pd.DataFrame() 9for key, col in df.iteritems(): 10 col = col.dropna() 11 departure = col[(col != col.shift(-1)) & (pd.notnull(col.shift(-1)))].reset_index() 12 arrival = col[(col != col.shift(1)) & (pd.notnull(col.shift(1)))].reset_index() 13 df2 = df2.append(pd.DataFrame({ 14 'points' : departure[key] + '-' + arrival[key], 15 'time' : arrival['time'] - departure['time'], 16 'target' : key}), ignore_index=True) 17 18result = df2.pivot(index='target', columns='points', values='time')

投稿2017/10/16 04:16

magichan

総合スコア15898

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

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

0

意外と時間がかかった。Pandasは詳しくないので使用していません。

python

1data = '''\ 2time,point,detection 310:00:00,A,x 410:00:00,A,y 510:00:00,A,z 610:00:05,A,x 710:00:05,A,y 810:00:07,A,x 910:01:06,A, 1010:01:05,B,z 1110:01:05,B,y 1210:01:08,B,x 1310:01:08,B,y 1410:01:08,B,z 1510:01:45,B,y 1610:01:45,B,z 1710:01:55,B,y 1810:02:01,B, 1910:02:10,C,x 2010:02:22,C,x 2110:02:22,C,y 2210:02:50,C,x 2310:02:50,C,y 2410:02:50,C,z 2510:03:01,C,x 2610:03:01,C,y 2710:03:02,C,x 2810:03:09,C, 29''' 30 31from collections import defaultdict 32from itertools import product 33from operator import sub 34from datetime import datetime 35 36 37# Parse source data into nested dict 38# acts -> {who: {loc: [t1, t2, ...]}} 39acts = defaultdict(lambda : defaultdict(list)) 40for line in data.splitlines()[1:]: 41 t, loc, who = line.split(',') 42 acts[who][loc].append(t) 43acts.pop('', None) 44 45 46# Caluculate durations between 2 locations 47# result -> {who: [T_ab, T_bc]} 48result = defaultdict(list) 49t_parser = lambda t: datetime.strptime(t, '%H:%M:%S') 50for who, (src, dst) in product('xyz', ('AB', 'BC')): 51 times = (min(acts[who][dst]), max(acts[who][src])) 52 result[who].append(sub(*map(t_parser, times))) 53 54 55# Output result using print() 56print(',A-B,B-C') 57for who in sorted(result.keys()): 58 row = [who] + result[who] 59 print(*row, sep=',')

投稿2017/10/14 08:15

YouheiSakurai

総合スコア6142

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問