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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

1回答

2240閲覧

複数の時刻書式をpandasで読み込む方法

MagMag

総合スコア80

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

1グッド

0クリップ

投稿2020/11/16 05:54

編集2020/11/16 06:28

エクセルを元に作成されたcsvファイルを読み込み、pandasのpd.to_datetimeを使ってdatetime型に変換するスクリプトを作ろうと思っています。ただ、エクセルの保存方法の変更により、以下のファイル1、2のように時間表記に揺れが発生しています。

このとき、それぞれの時間書式に応じてto_datetimeのスクリプトをif分で分けたいと思っているのですが、現在の書式を判定する方法は何を使ったらいいのでしょうか?

len(df['月日'][0])で判定することを考えたのですが、別の似た書式が入ってきたときにエラーになると思ったので、今の書式方法を識別できる判定をしたいと考えています(その意味で、if文で分けなくても変換できる方法があれば教えていただけないでしょうか?)。


ファイル1

月日時分Value
4月1日8:40:001
4月1日8:40:103

ファイル2

月日時分Value
2020/10/18:551
2020/10/18:562

*秒記載がないが、00秒とみなして問題ない。


Python3

1# ファイル1を読む処理 2df = pd.read_csv('file1.csv') 3 4if ...: # ここで的確に判定したい(他の書式が来ても誤分類されないようにしたい) 5 df.index = pd.to_datetime(df['月日']+'/' + df['時分'], format='%Y/%m/%d/%H:%M:%S') 6elif ...: 7 df.index = pd.to_datetime(...) 8
toast-uz👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のように、to_datetimeのオプションでerrors='coerce'を入れることで、フォーマットエラーが発生したらna値がセットされます。あとは、fillnaでnaの箇所だけ次のフォーマットを試してみる、ということを繰り返します。データフレームの行単位でフォーマットが違う、フォーマットが3種類以上ある、といった状態でも、これを応用することで対応可能です。

Python

1import pandas as pd 2import io 3 4file1 = ''' 5月日 時分 Value 64月1日 8:40:00 1 74月1日 8:40:10 3 8''' 9 10file2 = ''' 11月日 時分 Value 122020/10/1 8:55 1 132020/10/1 8:56 2 14''' 15 16df = pd.read_csv(io.StringIO(file1.replace(' ', ','))) 17#df = pd.read_csv(io.StringIO(file2.replace(' ', ','))) 18 19year = 2020 20df['日時'] = pd.to_datetime( 21 df['月日'] + ' ' + df['時分'] , errors='coerce') 22df['日時'] = df['日時'].fillna(pd.to_datetime( 23 f'{year}年' + df['月日'] + ' ' + df['時分'], 24 format='%Y年%m月%d日 %H:%M:%S', errors='coerce')) 25 26print(df) 27# 月日 時分 Value 日時 28#0 4月1日 8:40:00 1 2020-04-01 08:40:00 29#1 4月1日 8:40:10 3 2020-04-01 08:40:10

投稿2020/11/16 11:17

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MagMag

2020/11/16 23:34

なるほど、そういう手があるのですね。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問