質問するログイン新規登録

質問編集履歴

2

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

2019/07/12 09:54

投稿

Higomon
Higomon

スコア33

title CHANGED
File without changes
body CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
 
50
50
  ## 【現状】抽出失敗したDataFrame
51
- - **試したこと1**
51
+ - **試したこと1(→ 正常動作を確認)**
52
52
  DataFrameに時系列を含まなければ、上記の理想通りとなるが、
53
53
  時系列を含むと以下のようなる。
54
54
 
@@ -66,8 +66,10 @@
66
66
  |5|NaT|PPS|NaN|NaN|NaN|
67
67
  |6|NaT|NaN|NaN|NaN|NaN|
68
68
 
69
+ **↑logファイル前処理のバグが原因だった**
70
+
69
71
  ---
70
- - **試したこと2**
72
+ - **試したこと2(→ 正常動作を確認)**
71
73
 
72
74
  ```Jupyter
73
75
  In[]: df.query('Refid' == 'PPS')
@@ -75,9 +77,10 @@
75
77
  Out[]:
76
78
  ...
77
79
  ValueError: expr must be a string to be evaluated, <class 'bool'> given
80
+ ** ↑logファイル前処理のバグが原因だった**
78
81
 
79
82
 
80
- ## Code
83
+ ## 【解決済】Code
81
84
  ```Python
82
85
  import numpy as np
83
86
  import pandas as pd
@@ -87,7 +90,7 @@
87
90
 
88
91
  # 列名の取得
89
92
  # logファイル先頭3行から抽出
90
- def get_Header(f, h):
93
+ def get_Header(f):
91
94
  c = 0
92
95
  for a in f:
93
96
  if '=' not in a:
@@ -99,13 +102,12 @@
99
102
  s = s.replace("\n", "") #改行コードの除去
100
103
  s = s.split(",")
101
104
  del s[2:5] #不要な列の削除
102
- h.append(s)
103
105
 
104
106
  c += 1
105
107
  if c == 3:
106
108
  break
107
109
 
108
- return h
110
+ return s
109
111
 
110
112
  def get_Body(f, body):
111
113
  # ファイル先頭以外に定期的に含まれる列名(3行連続)は無視
@@ -127,9 +129,8 @@
127
129
  f = open(path, mode='rt')
128
130
 
129
131
  # /// 前処理 ///
130
- #列名の取得
132
+ #列名(リスト)の取得
131
- header = []
132
- get_Header(f, header)
133
+ header = get_Header(f)
133
134
 
134
135
  #ファイルボディの取得
135
136
  body = []
@@ -139,19 +140,19 @@
139
140
 
140
141
  #List --> Pandas DataFrameに変換
141
142
  df = pd.DataFrame(body, dtype=float)
142
- df.columns = header #columnsの指定
143
+ df.columns = header #columnsの指定 (← get_Header関数を修正)
143
144
 
144
145
  #Cast
145
- df['Date Time(UTC)'] = pd.to_datetime(df['Date Time(UTC)',])
146
+ df['Date Time(UTC)'] = pd.to_datetime(df['Date Time(UTC)'])
146
147
  df['Raw offset'] = df['Disp.'].astype(float)
147
148
 
148
149
 
149
150
  # /// 行の抽出 ///
150
- #試したこと1
151
+ #試したこと1 ←正常動作
151
152
  print(df[df['Refid'] == 'PPS'])
152
153
 
153
- #試したこと2
154
+ #試したこと2 ←正常動作
154
- df.query("Refid == 'PPS'")
155
+ print(df.query("Refid == 'PPS'"))
155
156
 
156
157
  if __name__ == '__main__':
157
158
  main()

1

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

2019/07/12 09:54

投稿

Higomon
Higomon

スコア33

title CHANGED
File without changes
body CHANGED
@@ -9,7 +9,13 @@
9
9
  ・Python初学者
10
10
  ・開発経験 Excel VBAのみ
11
11
 
12
+
13
+ ## (Original) logデータ
14
+ [refclocks.log](https://www.dropbox.com/s/ss0wub1dxc1o64q/refclocks.log?dl=0)
15
+
12
- ## データ
16
+ ## (前処理後) logデータ
17
+ 前処理は最下部記載のコードをご参照。
18
+
13
19
  ||Date Time(UTC)|Refid|Raw offset|Cooked offset|Disp.|
14
20
  |:--|:--|:--|:--|:--|:--|
15
21
  |0|2019-05-25 16:51:22.999972|PPSx|2.731100e-05|0.000027|1.000000e-09|
@@ -71,6 +77,87 @@
71
77
  ValueError: expr must be a string to be evaluated, <class 'bool'> given
72
78
 
73
79
 
80
+ ## Code
81
+ ```Python
82
+ import numpy as np
83
+ import pandas as pd
84
+ import re #正規表現
85
+
86
+ path = "D:\refclocks.log"
87
+
88
+ # 列名の取得
89
+ # logファイル先頭3行から抽出
90
+ def get_Header(f, h):
91
+ c = 0
92
+ for a in f:
93
+ if '=' not in a:
94
+ a = a.lstrip(' ') #文字列先頭の半角スペースを削除
95
+ s = re.sub(r" +", ",", a)
96
+ s = s.replace("Date,(UTC),Time,", "Date Time(UTC),") #1列目と2列目を結合
97
+ s = s.replace("Raw,offset,", "Raw offset,")
98
+ s = s.replace("Cooked,offset,", "Cooked offset,")
99
+ s = s.replace("\n", "") #改行コードの除去
100
+ s = s.split(",")
101
+ del s[2:5] #不要な列の削除
102
+ h.append(s)
103
+
104
+ c += 1
105
+ if c == 3:
106
+ break
107
+
108
+ return h
109
+
110
+ def get_Body(f, body):
111
+ # ファイル先頭以外に定期的に含まれる列名(3行連続)は無視
112
+ for a in f:
113
+ if '=' not in a:
114
+ if a[0] != ' ':
115
+ s = re.sub(r" +", ",", a) #複数半角スペース → 1つの半角スペース
116
+ s = s.replace("\n", "") #改行コードの除去
117
+ s = s.split(",")
118
+ tmp = s[0] + ' ' + s[1] #1列目と2列目を結合
119
+ s[0] = tmp
120
+ del s[1] #不要な列の削除
121
+ del s[2:5]
122
+ body.append(s)
123
+
124
+ return body
125
+
126
+ def main():
127
+ f = open(path, mode='rt')
128
+
129
+ # /// 前処理 ///
130
+ #列名の取得
131
+ header = []
132
+ get_Header(f, header)
133
+
134
+ #ファイルボディの取得
135
+ body = []
136
+ get_Body(f, body)
137
+
138
+ f.close()
139
+
140
+ #List --> Pandas DataFrameに変換
141
+ df = pd.DataFrame(body, dtype=float)
142
+ df.columns = header #columnsの指定
143
+
144
+ #Cast
145
+ df['Date Time(UTC)'] = pd.to_datetime(df['Date Time(UTC)',])
146
+ df['Raw offset'] = df['Disp.'].astype(float)
147
+
148
+
149
+ # /// 行の抽出 ///
150
+ #試したこと1
151
+ print(df[df['Refid'] == 'PPS'])
152
+
153
+ #試したこと2
154
+ df.query("Refid == 'PPS'")
155
+
156
+ if __name__ == '__main__':
157
+ main()
158
+ ```
159
+
160
+
74
161
  ###環境
75
162
  Windows 10
76
163
  Anaconda (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)]