質問編集履歴
2
記載codeを修正し、正常動作を確認
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
|
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
|
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
|
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ファイルの前処理もすべて記載
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)]
|