質問編集履歴
4
ご質問への回答を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -102,7 +102,12 @@
|
|
102
102
|
|
103
103
|
if __name__ == "__main__":
|
104
104
|
main()
|
105
|
-
ソースコード
|
106
105
|
```
|
106
|
+
### ご質問への回答
|
107
|
+
■tatsu99様
|
108
|
+
ご質問ありがとうございます。
|
109
|
+
回答ですが、1については「基準のレコードを含めて10件以上」となります。
|
110
|
+
2につきましては、ご質問のとおり「基準となるレコードの時刻とユーザのみ」を想定していましたが、私の環境で実行したところ、該当する条件のものがすべて出力されていました。。
|
111
|
+
しかし、この部分に関しては全て出力されたとしても、後で簡単に処理できるのでこのままでも良いと思っています。
|
107
112
|
|
108
113
|
|
3
コードの空白を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -87,8 +87,8 @@
|
|
87
87
|
aa = datetime.strptime(date,"%Y/%m/%d %H:%M:%S")
|
88
88
|
bb = user
|
89
89
|
cc = atai
|
90
|
-
|
90
|
+
csv2 = load_csv(source_file_path)
|
91
|
-
|
91
|
+
for date, user, atai in csv2
|
92
92
|
dd = process_2(aa,bb,cc,csv)
|
93
93
|
if dd >= 10:
|
94
94
|
yield [date, user]
|
2
質問内容の修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
python csvのループ処理
|
1
|
+
python csvのループ処理の高速化
|
test
CHANGED
@@ -5,9 +5,12 @@
|
|
5
5
|
|
6
6
|
以下のcsvであれば、2022/05/26 20:52:15から2022/05/26 21:00:22の間に、ユーザーAの値が11回noneとなっているので、Aが新たなcsvに吐き出されるようにしようとしています。
|
7
7
|
|
8
|
-
しかし、自分の書いたスクリプトでは最初の「none」(ヘッダを含め4行目)を検出し、①から③の条件を確認後、次の処理に進んだ際に読み込んでいるcsvの行が意図しない箇所(ヘッダを含め18行目、条件確認後、処理を終了した行の続き)に進んでいました。
|
8
|
+
~~しかし、自分の書いたスクリプトでは最初の「none」(ヘッダを含め4行目)を検出し、①から③の条件を確認後、次の処理に進んだ際に読み込んでいるcsvの行が意図しない箇所(ヘッダを含め18行目、条件確認後、処理を終了した行の続き)に進んでいました。
|
9
|
-
本来であれば、最初の「none」を検出した後、条件に一致しないので次の行からの処理に進み、2回目のnone(ヘッダを含め8行目)を検出して条件の確認、次は3回目のnoneを検出とやっていきたいのですが、ループ処理が上手くいかず詰まっているところです。
|
9
|
+
本来であれば、最初の「none」を検出した後、条件に一致しないので次の行からの処理に進み、2回目のnone(ヘッダを含め8行目)を検出して条件の確認、次は3回目のnoneを検出とやっていきたいのですが、ループ処理が上手くいかず詰まっているところです。~~(自己解決済み)
|
10
10
|
|
11
|
+
しかし、対象のcsvが50万行程あるため自分の書いたスクリプトでは物凄い時間が掛かってしまいます。
|
12
|
+
大量の行があるcsvに対してfor文を3回も使用しているのが原因だと思っているのですが、解決方法が分からず困っているため、お知恵を拝借できればと思っております。
|
13
|
+
どうぞよろしくお願いいたします。
|
11
14
|
|
12
15
|
|
13
16
|
```
|
@@ -84,8 +87,10 @@
|
|
84
87
|
aa = datetime.strptime(date,"%Y/%m/%d %H:%M:%S")
|
85
88
|
bb = user
|
86
89
|
cc = atai
|
90
|
+
csv2 = load_csv(source_file_path)
|
91
|
+
for date, user, atai in csv2
|
87
|
-
dd = process_2(aa,bb,cc,csv)
|
92
|
+
dd = process_2(aa,bb,cc,csv)
|
88
|
-
if dd >= 10:
|
93
|
+
if dd >= 10:
|
89
94
|
yield [date, user]
|
90
95
|
else :
|
91
96
|
pass
|
@@ -100,12 +105,4 @@
|
|
100
105
|
ソースコード
|
101
106
|
```
|
102
107
|
|
103
|
-
### 試したこと
|
104
|
-
該当コードの「process_2」関数に渡しているcsvが「process_1」関数と同じcsvであることが問題なのではと考え、もう一つ同じcsvを格納した変数を作成して、process_2」関数に渡しましたが以下のエラーが発生してしまいました。
|
105
108
|
|
106
|
-
```
|
107
|
-
|
108
|
-
ValueError: time data 'date' does not match format '%Y/%m/%d %H:%M:%S'
|
109
|
-
```
|
110
|
-
|
111
|
-
|
1
不要な変数を削除
test
CHANGED
File without changes
|
test
CHANGED
@@ -68,7 +68,6 @@
|
|
68
68
|
count = 0
|
69
69
|
for date, user, atai in csv:
|
70
70
|
aaa = datetime.strptime(date,"%Y/%m/%d %H:%M:%S")
|
71
|
-
bbb = aaa - day
|
72
71
|
|
73
72
|
if aaa - day < timedelta(minutes = 10) and user == us and atai == at:
|
74
73
|
count += 1
|