質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

解決済

時系列DataFrameで特定列に含まれるキーワードにより行を抽出

Higomon
Higomon

総合スコア31

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

2回答

0評価

0クリップ

935閲覧

投稿2019/07/10 06:56

編集2019/07/12 09:54
  • 最終目標
    Python, Pandasでlogファイルの時系列解析

  • 実現したいこと
    時系列DataFrameにおいて、特定列に含まれるキーワードにより行を抽出
    具体的には、列名"Refid"に"PPS"というキーワードが含まれれば、その行を抽出

質問者背景
・Python初学者
・開発経験 Excel VBAのみ

(Original) logデータ

refclocks.log

(前処理後) logデータ

前処理は最下部記載のコードをご参照。

Date Time(UTC)RefidRaw offsetCooked offsetDisp.
02019-05-25 16:51:22.999972PPSx2.731100e-050.0000271.000000e-09
12019-05-25 16:51:22.323771NMEA-3.237718e-010.1762281.000000e-03
22019-05-25 16:51:23.999975PPS2.434500e-050.0000241.000000e-09
32019-05-25 16:51:23.999975PPSx2.434500e-050.0000241.000000e-09
42019-05-25 16:51:23.324379NMEA-3.243791e-010.1756211.000000e-03
52019-05-25 16:51:24.999973PPS2.658800e-050.0000271.000000e-09
62019-05-25 16:51:24.999973PPSx2.658800e-050.0000271.000000e-09

** 各列の型**

Jupyter

In[]: df.dtypes

Out[]:
Date Time(UTC) datetime64[ns]
Refid object
Raw offset float64
Cooked offset float64
Disp. float64
dtype: object

【理想】抽出後のDataFrame

Date Time(UTC)RefidRaw offsetCooked offsetDisp.
22019-05-25 16:51:23.999975PPS2.434500e-050.0000241.000000e-09
52019-05-25 16:51:24.999973PPS2.658800e-050.0000271.000000e-09

【現状】抽出失敗したDataFrame

  • 試したこと1(→ 正常動作を確認)

DataFrameに時系列を含まなければ、上記の理想通りとなるが、
時系列を含むと以下のようなる。

Jupyter

In[]: df[df['Refid'] == 'PPS']

Out[]:
||Date Time(UTC)|Refid|Raw offset|Cooked offset|Disp.|
|:--|:--|:--|
|0|NaT|NaN|NaN|NaN|NaN|
|1|NaT|NaN|NaN|NaN|NaN|
|2|NaT|PPS|NaN|NaN|NaN|
|3|NaT|NaN|NaN|NaN|NaN|
|4|NaT|NaN|NaN|NaN|NaN|
|5|NaT|PPS|NaN|NaN|NaN|
|6|NaT|NaN|NaN|NaN|NaN|

↑logファイル前処理のバグが原因だった


  • 試したこと2(→ 正常動作を確認)

Jupyter

In[]: df.query('Refid' == 'PPS')

Out[]:
...
ValueError: expr must be a string to be evaluated, <class 'bool'> given
** ↑logファイル前処理のバグが原因だった**

【解決済】Code

Python

import numpy as np import pandas as pd import re #正規表現 path = "D:\refclocks.log" # 列名の取得 # logファイル先頭3行から抽出 def get_Header(f): c = 0 for a in f: if '=' not in a: a = a.lstrip(' ') #文字列先頭の半角スペースを削除 s = re.sub(r" +", ",", a) s = s.replace("Date,(UTC),Time,", "Date Time(UTC),") #1列目と2列目を結合 s = s.replace("Raw,offset,", "Raw offset,") s = s.replace("Cooked,offset,", "Cooked offset,") s = s.replace("\n", "") #改行コードの除去 s = s.split(",") del s[2:5] #不要な列の削除 c += 1 if c == 3: break return s def get_Body(f, body): # ファイル先頭以外に定期的に含まれる列名(3行連続)は無視 for a in f: if '=' not in a: if a[0] != ' ': s = re.sub(r" +", ",", a) #複数半角スペース → 1つの半角スペース s = s.replace("\n", "") #改行コードの除去 s = s.split(",") tmp = s[0] + ' ' + s[1] #1列目と2列目を結合 s[0] = tmp del s[1] #不要な列の削除 del s[2:5] body.append(s) return body def main(): f = open(path, mode='rt') # /// 前処理 /// #列名(リスト)の取得 header = get_Header(f) #ファイルボディの取得 body = [] get_Body(f, body) f.close() #List --> Pandas DataFrameに変換 df = pd.DataFrame(body, dtype=float) df.columns = header #columnsの指定 (← get_Header関数を修正) #Cast df['Date Time(UTC)'] = pd.to_datetime(df['Date Time(UTC)']) df['Raw offset'] = df['Disp.'].astype(float) # /// 行の抽出 /// #試したこと1 ←正常動作 print(df[df['Refid'] == 'PPS']) #試したこと2 ←正常動作 print(df.query("Refid == 'PPS'")) if __name__ == '__main__': main()

###環境
Windows 10
Anaconda (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)]
Python: 3.7.3, Pandas: 0.24.2
Jupyter Notebook

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

can110

2019/07/10 07:18

報告のみ。以下の当方環境では正常に動作します。提示コードに問題はなさそうです。 Win10 Python 3.5.5 |Anaconda custom (64-bit)| (default, Apr 7 2018, 04:52:34) [MSC v.1900 64 bit (AMD64)] on win32 pandas:0.23.0 コンソール上で実行
Higomon

2019/07/10 08:14

ご検証、ありがとうござます。 お使いの環境だと正常動作するのですね。。。 Pandasではなく、Numpyの話ですが、先日取得したAnaconda(Anaconda3-2019.03)で Numpyのimportが出来ず、悪戦苦闘しました。 以下のサイトを参考に、Numpyのimport問題は解決しましたが、 上記Pandasの問題は解決に至っていません。 https://teratail.com/questions/149566 取り急ぎ、お礼申し上げます。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。