パンダでCSVファイルを読み取るときに日付/日時列を自動検出してデータ型を設定する方法

ソースノード: 1106147

パンダでCSVファイルを読み取るときに日付/日時列を自動検出してデータ型を設定する方法

read_csv( ) が、たとえば「2021-03-04」や「2021-03-04 21:37:01.123」を単なる「オブジェクト」データ型として読み取る場合、多くの場合、それらをすべて一度に真の日時データ型に自動変換することができます。


By デビッドBローゼン(PhD)、IBM GlobalFinancingの自動クレジット承認のリードデータサイエンティスト



Pandas データフレームに読み込む CSV データ ファイルがあり、その列の一部は日付または日時ですが、これらの列の名前を事前に識別/指定する手間を省きたいとします。 代わりに、に示されているデータ型を自動的に取得したいと考えています。 df.info() 写真の出力 上記、 適切な列が配置されている場所 自動的に 指定された日時データ型 (緑色の枠線のボックス)。 それを実現する方法は次のとおりです。

from dt_auto import read_csv
df=read_csv('myfile.csv')

私がやったことに注意してください   上記の pd.read_csv (read_csv の Pandas バージョン) を直接呼び出します。 私の dt_auto.read_csv 関数 (下記のコードを参照) は pd.read_csv() 自体を呼び出し、検出された XNUMX つの日時列のデータ型を自動的に検出して変換しました。 (この df の内容は以下に示されます。)

通常の Pandas pd.read_csv() を使用していたら、デフォルトで以下のように単に汎用オブジェクト データ型を取得したでしょう (赤い枠線のボックス)。

from pandas import read_csv
df=read_csv('myfile.csv')
df.info()



元のコードとの唯一の違いは import ステートメントにあることに注意してください。「from dt_auto」を「from pandas」に変更しました。 これは、「=pd.read_csv()」または「=dt_auto.read_csv()」として修飾するのではなく、全体を通して「=read_csv()」のみを使用する限り十分です。

ここに私の内容があります dt_auto.py (「日時自動」):

import pandas as pd
def dt_inplace(df): """Automatically detect and convert (in place!) each dataframe column of datatype 'object' to a datetime just when ALL of its non-NaN values can be successfully parsed by pd.to_datetime(). Also returns a ref. to df for convenient use in an expression. """ from pandas.errors import ParserError for c in df.columns[df.dtypes=='object']: #don't cnvt num try: df[c]=pd.to_datetime(df[c]) except (ParserError,ValueError): #Can't cnvrt some pass # ...so leave whole column as-is unconverted return df
def read_csv(*args, **kwargs): """Drop-in replacement for Pandas pd.read_csv. It invokes pd.read_csv() (passing its arguments) and then auto- matically detects and converts each column whose datatype is 'object' to a datetime just when ALL of the column's non-NaN values can be successfully parsed by pd.to_datetime(), and returns the resulting dataframe. """ return dt_inplace(pd.read_csv(*args, **kwargs))

しかし、これは危険ではありませんか? 列の XNUMX つが完全に日時列ではない場合はどうなるでしょうか? もちろん、たまたま日付のように見えて日付ではない、あいまいな文字列が存在する可能性はありますが、次の XNUMX つの理由により、このコードが非日付時刻文字列を盲目的に変換したり失ったりするリスクはそれほど高くありません。

  1. このコードは、   列内の値はすべて変換されます。 あらゆる この列の NaN 以外の値は、pd.to_datetime によって正常に解析され、日付時刻に変換できます。 言い換えれば、文字列を日時として理解できないため、文字列を pd.NaT (「失敗」の結果) に変換することはできません。
  2. それは   pd.to_datetime が 64 のような数値を日付 64-2000 にうまく (しかしおそらく望ましくなく) 変換したとしても、既にオブジェクト以外の型、つまり int2000 や float01 のような特定の型として解釈されている列を変換しようとします。 -01.

これまでの私の経験では、dt_auto.read_csv 関数は一般的なデータフレームで実行するのにそれほど時間はかかりません。 非日時オブジェクト (文字列) 列が多数ある場合でも、ほとんどの場合、そのような各列の先頭近くに日時として解析できない値がすぐに見つかり、諦めて次の列に進みます。列の残りの値を解析することはありません。

dt_auto.read_csv() から得られるデータフレームは次のようになります。ただし、これを見ただけでは、XNUMX つの適切な列が実際に datetime データ型であるかどうかは必ずしもわかりません。 偶然ですが、CSV ファイルには Update_Timestamp の秒の小数点以下の桁数 (XNUMX 桁、XNUMX 桁、XNUMX 桁) が異なっていましたが、日時データ型自体は関係なく、そのような桁数が XNUMX 桁を示しています。 実際、CSV ファイル内の生年月日には日付のみが含まれており (時刻は含まれていません)、時、分、秒のゼロ (小数部分のゼロを含む) を含む完全な日時として保存されていましたが、列内のすべての時間コンポーネントが含まれていました。ゼロにすると、Pandas はこの列の日付 (年-月-日) のみを表示します。



もちろん、pd.to_datetime、したがって dt_auto.read_csv は、デフォルトですべての可能な日付と日時の形式を処理できるわけではありませんが、dataframe.to_csv メソッドやその他の多くのメソッドによって書き込まれたものなど、多くの一般的な明確な (通常は年月日) 形式を処理します。ツールには、多くの ISO 日時形式 (通常、日付と時刻をスペースではなく「T」で区切る) が含まれます。 タイムゾーン情報を含む日時については、通常そのようなデータを目にすることがないため実験していませんが、コードをさらに変更することでこれらをより適切に処理できるかどうか、応答コメントでお知らせください。

どう思いますか? この小さな記事は役に立ちましたか? そして、上記の dt_auto.py コードをコピー/インポートする必要がないように、Pandas 自体に (pd.read_csv 関数自体などに) オプションでこれを行う機能を追加する必要がありますか? 皆様のコメントやご質問がここに返信されることを嬉しく思います。

 
エリオットガンに感謝します。

 
バイオ: デビッドBローゼン(PhD) IBM GlobalFinancingの自動クレジット承認のリードデータサイエンティストです。 デビッドの著作の詳細については、 dabruro.medium.com.

元の。 許可を得て転載。

関連する

出典: https://www.kdnuggets.com/2021/10/auto-detect-date-datetime-columns-and-set-their-datatype-when-reading-a-csv-file-in-pandas.html

タイムスタンプ:

より多くの KDナゲット