0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

複数行のヘッダー, 空白区切りのテキストデータをpandasで読み込み複数列にまたがっている日時データをto_datetimeに入れる

Posted at

自然科学分野の観測データって運用している大学や学会が独自に決めたフォーマットで保存されてることが多くて、例えば以下のような感じです:

ABC...
......
......
......
...XYZ
YYMMDD hhmmss XXXXX YYYYY ZZZZZ TTTTT
YYMMDD hhmmss XXXXX YYYYY ZZZZZ TTTTT
YYMMDD hhmmss XXXXX YYYYY ZZZZZ TTTTT
YYMMDD hhmmss XXXXX YYYYY ZZZZZ TTTTT

先頭から複数行にわたって観測点などの情報が記述されていて
その後複数列に分けて日付と時間が記述されています。
最悪なやつになると
YY MM DD hh mm ss XXXXX YYYYY ZZZZZ TTTTT
みたいになっていて、、、本当に辛い。
このデータの多様性に大変困っていたのですが、
まあ、地道に頑張るしかないですよね。
色んな方の記事を参考にしつつ、

  1. read_csvのオプションskiprows=xxで複雑なヘッダーは飛ばす
  2. read_csvのオプションheader=Noneで1行目のデータが列名になるのを防ぐ
  3. read_csvのオプションnames=['A', ..., 'Z']で列名を指定
  4. str.catを使って複数の列を結合
  5. 結合した列をint型に変換
  6. できた配列をto_datetimeでdatetime型に変換
    でできました。

記述:

import pandas as pd
import datetime

f = open("filename","r")

df=pd.read_csv(f, delim_whitespace=True, header=None, skiprows=23, names=['DAY', 'HOUR', 'X', 'Y', 'Z', 'T'], engine='python')
df['DATESTR'] = df['DAY'].astype(str).str.cat(df['HOUR'].astype(str))
df['intDATE'] = df['DATESTR'].astype(int)
DATE = pd.to_datetime(df['intDATE'],format='%y%m%d%H%M%S')

f.close()

参考:
pandas.DataFrameの複数の列の文字列を結合して新たな列を生成

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?