質問編集履歴

2

記載codeを修正し、正常動作を確認

2019/07/12 09:54

投稿

Higomon
Higomon

スコア33

test CHANGED
File without changes
test CHANGED
@@ -98,7 +98,7 @@
98
98
 
99
99
  ## 【現状】抽出失敗したDataFrame
100
100
 
101
- - **試したこと1**
101
+ - **試したこと1(→ 正常動作を確認)**
102
102
 
103
103
  DataFrameに時系列を含まなければ、上記の理想通りとなるが、
104
104
 
@@ -134,9 +134,13 @@
134
134
 
135
135
 
136
136
 
137
+ **↑logファイル前処理のバグが原因だった**
138
+
139
+
140
+
137
141
  ---
138
142
 
139
- - **試したこと2**
143
+ - **試したこと2(→ 正常動作を確認)**
140
144
 
141
145
 
142
146
 
@@ -152,11 +156,13 @@
152
156
 
153
157
  ValueError: expr must be a string to be evaluated, <class 'bool'> given
154
158
 
155
-
159
+ ** ↑logファイル前処理のバグが原因だった**
156
-
157
-
158
-
160
+
161
+
162
+
163
+
164
+
159
- ## Code
165
+ ## 【解決済】Code
160
166
 
161
167
  ```Python
162
168
 
@@ -176,7 +182,7 @@
176
182
 
177
183
  # logファイル先頭3行から抽出
178
184
 
179
- def get_Header(f, h):
185
+ def get_Header(f):
180
186
 
181
187
  c = 0
182
188
 
@@ -200,8 +206,6 @@
200
206
 
201
207
  del s[2:5] #不要な列の削除
202
208
 
203
- h.append(s)
204
-
205
209
 
206
210
 
207
211
  c += 1
@@ -212,7 +216,7 @@
212
216
 
213
217
 
214
218
 
215
- return h
219
+ return s
216
220
 
217
221
 
218
222
 
@@ -256,11 +260,9 @@
256
260
 
257
261
  # /// 前処理 ///
258
262
 
259
- #列名の取得
263
+ #列名(リスト)の取得
260
-
261
- header = []
264
+
262
-
263
- get_Header(f, header)
265
+ header = get_Header(f)
264
266
 
265
267
 
266
268
 
@@ -280,13 +282,13 @@
280
282
 
281
283
  df = pd.DataFrame(body, dtype=float)
282
284
 
283
- df.columns = header #columnsの指定
285
+ df.columns = header #columnsの指定 (← get_Header関数を修正)
284
286
 
285
287
 
286
288
 
287
289
  #Cast
288
290
 
289
- df['Date Time(UTC)'] = pd.to_datetime(df['Date Time(UTC)',])
291
+ df['Date Time(UTC)'] = pd.to_datetime(df['Date Time(UTC)'])
290
292
 
291
293
  df['Raw offset'] = df['Disp.'].astype(float)
292
294
 
@@ -296,15 +298,15 @@
296
298
 
297
299
  # /// 行の抽出 ///
298
300
 
299
- #試したこと1
301
+ #試したこと1 ←正常動作
300
302
 
301
303
  print(df[df['Refid'] == 'PPS'])
302
304
 
303
305
 
304
306
 
305
- #試したこと2
307
+ #試したこと2 ←正常動作
306
-
308
+
307
- df.query("Refid == 'PPS'")
309
+ print(df.query("Refid == 'PPS'"))
308
310
 
309
311
 
310
312
 

1

logファイルの前処理もすべて記載

2019/07/12 09:54

投稿

Higomon
Higomon

スコア33

test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,19 @@
20
20
 
21
21
 
22
22
 
23
+
24
+
25
+ ## (Original) logデータ
26
+
27
+ [refclocks.log](https://www.dropbox.com/s/ss0wub1dxc1o64q/refclocks.log?dl=0)
28
+
29
+
30
+
23
- ## データ
31
+ ## (前処理後) logデータ
32
+
33
+ 前処理は最下部記載のコードをご参照。
34
+
35
+
24
36
 
25
37
  ||Date Time(UTC)|Refid|Raw offset|Cooked offset|Disp.|
26
38
 
@@ -144,6 +156,168 @@
144
156
 
145
157
 
146
158
 
159
+ ## Code
160
+
161
+ ```Python
162
+
163
+ import numpy as np
164
+
165
+ import pandas as pd
166
+
167
+ import re #正規表現
168
+
169
+
170
+
171
+ path = "D:\refclocks.log"
172
+
173
+
174
+
175
+ # 列名の取得
176
+
177
+ # logファイル先頭3行から抽出
178
+
179
+ def get_Header(f, h):
180
+
181
+ c = 0
182
+
183
+ for a in f:
184
+
185
+ if '=' not in a:
186
+
187
+ a = a.lstrip(' ') #文字列先頭の半角スペースを削除
188
+
189
+ s = re.sub(r" +", ",", a)
190
+
191
+ s = s.replace("Date,(UTC),Time,", "Date Time(UTC),") #1列目と2列目を結合
192
+
193
+ s = s.replace("Raw,offset,", "Raw offset,")
194
+
195
+ s = s.replace("Cooked,offset,", "Cooked offset,")
196
+
197
+ s = s.replace("\n", "") #改行コードの除去
198
+
199
+ s = s.split(",")
200
+
201
+ del s[2:5] #不要な列の削除
202
+
203
+ h.append(s)
204
+
205
+
206
+
207
+ c += 1
208
+
209
+ if c == 3:
210
+
211
+ break
212
+
213
+
214
+
215
+ return h
216
+
217
+
218
+
219
+ def get_Body(f, body):
220
+
221
+ # ファイル先頭以外に定期的に含まれる列名(3行連続)は無視
222
+
223
+ for a in f:
224
+
225
+ if '=' not in a:
226
+
227
+ if a[0] != ' ':
228
+
229
+ s = re.sub(r" +", ",", a) #複数半角スペース → 1つの半角スペース
230
+
231
+ s = s.replace("\n", "") #改行コードの除去
232
+
233
+ s = s.split(",")
234
+
235
+ tmp = s[0] + ' ' + s[1] #1列目と2列目を結合
236
+
237
+ s[0] = tmp
238
+
239
+ del s[1] #不要な列の削除
240
+
241
+ del s[2:5]
242
+
243
+ body.append(s)
244
+
245
+
246
+
247
+ return body
248
+
249
+
250
+
251
+ def main():
252
+
253
+ f = open(path, mode='rt')
254
+
255
+
256
+
257
+ # /// 前処理 ///
258
+
259
+ #列名の取得
260
+
261
+ header = []
262
+
263
+ get_Header(f, header)
264
+
265
+
266
+
267
+ #ファイルボディの取得
268
+
269
+ body = []
270
+
271
+ get_Body(f, body)
272
+
273
+
274
+
275
+ f.close()
276
+
277
+
278
+
279
+ #List --> Pandas DataFrameに変換
280
+
281
+ df = pd.DataFrame(body, dtype=float)
282
+
283
+ df.columns = header #columnsの指定
284
+
285
+
286
+
287
+ #Cast
288
+
289
+ df['Date Time(UTC)'] = pd.to_datetime(df['Date Time(UTC)',])
290
+
291
+ df['Raw offset'] = df['Disp.'].astype(float)
292
+
293
+
294
+
295
+
296
+
297
+ # /// 行の抽出 ///
298
+
299
+ #試したこと1
300
+
301
+ print(df[df['Refid'] == 'PPS'])
302
+
303
+
304
+
305
+ #試したこと2
306
+
307
+ df.query("Refid == 'PPS'")
308
+
309
+
310
+
311
+ if __name__ == '__main__':
312
+
313
+ main()
314
+
315
+ ```
316
+
317
+
318
+
319
+
320
+
147
321
  ###環境
148
322
 
149
323
  Windows 10