###前提・実現したいこと
pythonのプログラムで質問です。
以下のログがあります。
2012/01/02 13:00 0
2012/01/02 14:00 1
2012/01/02 14:01 1
2012/01/02 14:30 0
2012/01/02 14:31 0
2012/01/02 14:40 1
2012/01/03 01:00 0
このログの0と1の時間を日にちごとに集計を行いたいのです。
途中、0と1の間に1が入ったり、0が入ったりしたときは、無視をして、
(上のログの場合、14:00の1、14:31の0)です。
2012/01/02と2012/01/03で日にちをまたいだときは、23:59まで前日
00:00から2012/01/03に入れるようにしたいのですが方法が解りません。
プログラムのサンプルをお願いします。
###発生している問題・エラーメッセージ
エラーメッセージ
###該当のソースコード
#!/usr/bin/env python # -*- coding: utf-8 -*- import csv import datetime #CSVファイルを読み込んで、各行毎のリストにする。 f = open("/usr/local/bin/log.csv") reader= csv.reader(f, delimiter=",", quotechar='"') records = list(reader) f.close() #2列目が0の行と1の行に分ける from_list = [datetime.datetime.strptime(record[0], "%Y/%m/%d %H:%M:%S") for record in records if record[1]=='1'] to_list = [datetime.datetime.strptime(record[0], "%Y/%m/%d %H:%M:%S") for record in records if record[1]=='0'] #日毎の結果を格納する辞書を用意 result_dic = {} #to - from を行い、間の経過時間を取得して日付をkeyにした辞書に加算していく。 for from_dt, to_dt in zip(from_list, to_list): if result_dic.get(str(from_dt.date())) is None: result_dic[str(from_dt.date())] = (to_dt - from_dt).total_seconds() / 60 else: result_dic[str(from_dt.date())] += (to_dt - from_dt).total_seconds() / 60 #日付をkeyにした辞書のままだと日付で昇順に表示する時に面倒なのでリストに変換。 results = [{"date": date_str, "min": total_min} for date_str, total_min in result_dic.items()] results.sort(key=lambda x:x['date']) #日付でソート for result in results: #表示 print("{0}, TOTAL{1}min".format(result['date'], int(result['min'])))
###試したこと
0と1で分けて実行したのですが、0が連続したり1が連続したときにおかしくなります。
日付をまたぐと前日に入ってしまいます。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/25 08:26 編集
2017/08/25 10:26
2017/08/25 23:26