今回はPandasにおいて文字列データや数値データを日付データであるdatetime64型に変換する方法についてまとめていきます。

datetime64型はPythonにあるtimestamp型を継承したクラスとなっています。Pandasでの日付の扱いは、時系列データを分析する上で役に立つので覚えておくと良いでしょう。

to_datetime関数を使って文字列や数値と日付との変換していきたいと思います。

100%正規品 【お値下げ】Edit&Co レディースカウチンジャケット ファー付き ファー付き ニット/セーター

100%正規品 【お値下げ】Edit&Co レディースカウチンジャケット ファー付き ファー付き ニット/セーター

まずは""のようにフォーマットが定まっている場合についてです。

基本的なフォーマットなら関数が検知してくれる

この関数はある程度ならフォーマットを検知してくれるのでとりあえず入れてみてうまく行かなかったらフォーマットを個別に指定するという形で使っても問題ありません。

例えば""の例だと

In [1]: import pandas as pd
In [2]: str_1 = ''
In [3]: pd.to_datetime(str_1)
Out[3]: Timestamp()

のように正しく認識してくれます。

他の例でもみてみます。

In [4]: t_str = 
In [5]: pd.to_datetime(t_str)
Out[5]: Timestamp()

ですが、このような例の場合、フォーマットを関数が内部で判断する必要があるため、大規模なデータを一括でdatetime64型に変換しようとすると処理の時間にかなりの差が出てきますのでデータ数が多いほどフォーマットを指定することをオススメします。

♡おまとめ3点 ⭐︎あや様⭐︎ご専用♡フォーマットの指定の仕方

フォーマットの指定の仕方ですが、

format引数で指定できます。

先ほどの""ですと、format='%Y/%m/%d'のように指定します。ここの'%Y'は4桁の年数となり、小文字の'%y'は2桁の年数となります。

以下の表にフォーマットとの対応関係を記載しておきます。

大文字と小文字とで違うだけで大きな違いが出てきてしまうので注意が必要です。

表記 説明
%Y 4桁の年数 (例 2018,1996…)
%y 2桁の年数 (例 18, 96..)
%m 2桁の月 [01,12] (例 01, 07, 12..)
%d 2桁の日付 [01,31] (例 02, 28, 31..)
%H 24時間表記の時間 [00,23] (例 00, 12, 21..)
%I 12時間表記の時間 [01,12] (例 01, 07, 12..)
%M 2桁の分 [00, 59] (例 00, 05, 38, 59..)
%S 秒 [00, 61] (例 00, 15, 39, 60, 61..)
60,61は00,01と同じ
%w 整数表記された曜日 [0(日曜), 6] (例 1(月曜), 4(木曜), 6(土曜)…)
%U 週番号 [00,53] 日曜が週の始めとしてカウントされる。年を通しての週の番号 (例 00, 03, 04, 52..)
%W 週番号 [00,53] 月曜が週の始めとしてカウントされる、年を通しての週の番号
%z UTC タイムゾーンからのオフセット +HHMMまたは-HHMMの形
新品 FUJIFILM フジノンレンズ XC50-230mm F4.5-6.7 OIS II [ブラック]

実際に変換してみます。

In シャフト ドライバー用 クレイジー リジェネシス LY-036]: time_sr = pd.Series([, , 20210111])
In [7]: convert_time = pd.to_datetime(time_sr, format='%Y%m%d')
In [8]: convert_time
Out[8]:
0   2018-10-24
1   2020-09-15
2   2021-01-11
dtype: datetime64[ns]
In [10]: time_sr_2 = pd.Series(['181024 'リスム フリーアドレスW9600 白脚ナチュラル Z−RFFLT−9612NA−WL  送料・組立・設置が無料 アール・エフ・ヤマカワ株式会社 319 , ])
In [11]: pd.to_datetime(time_sr_2, format='%y%m%d %H:%M') # 2桁の年数なので小文字の%y 時刻は%H:%Mで指定可能
Out[11]:
0   2018-10-24 13:24:00
1   2020-09-15 07:59:00
2   2021-01【新品・在庫あり】■Rinnai(リンナイ)ガス炊飯器【プロパンガス(LPG)用】[マットブラック]RR-100MTT-MB-LPG【送料無料(沖縄・離島除く)】11 23:45:00
dtype: datetime64[ns]

日本語表記が入っても変換できます。

In [18アコーデオンドア アコーデオンカーテン をオーダー クローザエクセル セフアTD-6048〜TD-6049 幅250×高さ210cm迄 time_j = 
In [20]: pd.to_datetime(time_j, format='%Y年%m月%d日 %H時%M分')
Out[20]: Timestamp()

S-VHSビデオデッキ パナソニック NV-SVB1 中古品 アウトレット品UNIX時間からの変換

今度は世界標準時(UTC)で 0時0分からの経過時間を表示するUNIX時間を変換します。 試しに13時25分00秒(日本時間)のUNIX時間である”1537417500”を変換してみます。ここでの表記は秒数なので、 unit='s'として表記を秒単位にします。

In [22]: pd.to_datetime(1537417500, unit='s') # UNIX時間を変換
Out[22]: Timestamp()

日本時間に変換してみます。一旦tz_localize('utc')で現在時刻の基準点がUTCであることを示してからtz_convert関数で変換します。 utc=Trueにしておけば関数の処理を1つ省略できます。

In [25]: pd.to_datetime(1537417500, unit='s').tz_localize('utc').tz_convert('Asia/Tokyo') # UNIX時間を変換
Out[25]: Timestamp(, tz='Asia/Tokyo')  
In [26]: utc_time = pd.to_datetime(1537417500,utc=True,unit='s') # utc=TrueにすることでタイムゾーンをUTCに設定できる
In [27]: utc_time
Out[27]: Timestamp(, tz='UTC')
In [28]: utc_time.tz_convert('Asia/Tokyo')
Out[28]: Timestamp(, tz='Asia/Tokyo')

デフォルトではunit='ns'となっておりナノ秒まで表記します(10の-9乘)。

In [29]: pd.to_datetime(1537417500293410982, unit='ns')
Out[29]: Timestamp()

ミリ秒の場合はuint='ms'で指定できます。

In [30]: pd.to_datetime(1537417500293, unit='ms')
Out[30]: Timestamp()

アーティストプリント マックコート / ギャバジンコットンパフォーマンス

パフォーマンスアップのためにはフォーマットを予め指定しておくもしくはinfer_datetime_format=Trueにしておくと高速化できます。

特に、フォーマット指定に当てはまらない形式(例えば月/日がのように月が1桁になっている時など)の時に効力を発揮します。

In [37]: long_t = pd.Series(['3/11/2000',,'3/13/2000']*2000)
In [38]: %timeit pd.to_datetime(long_t, infer_datetime_format=False) # デフォルト
1.45 s ± 20 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [39]: %timeit pd.to_datetime(long_t, infer_datetime_format=True) # True
24.4 ms ± 414 µs per loop (mean ± std. dev. of 7 runs, ロエベ Loewe レディース メガネ・サングラス Gold & Grey Oversized Sunglasses Shiny endura gold/Gold loops each)
In [40]: %timeit pd.to_datetime(long_t, format='%d/%m/%Y') # フォーマット指定
---------------------------------------------------------------------------
(エラーメッセージが表示される)
ValueError: time data '3/13/2000' does not match format '%d/%m/%Y' (match)

100%正規品 【お値下げ】Edit&Co レディースカウチンジャケット ファー付き ファー付き ニット/セーター

列データのラベルを指定しておくとそれらを組み合わせてdatetime64型のデータを作ることができます。

In [50]: df = pd.DataFrame({'year': [1998, 2012, 1990, 2018],
    ...:                    'month':[10, 1, 10, 12],
    ...:                    'day': [10, 11, 21, 1],
    ...:                   'hour': [12, 23, 14, 1],
    ...:                    'minute': [29, 3, 30, 59]})
    ...:                    
In [51]: pd.to_datetime(df)
Out[51]:
0   1998-10-10 12:29:00
1   2012-01-11 23:03:00
2   1990-10-21 14:30:00
3   2018-12-01 01:59:00
dtype: datetime64[イワタツール 90TG16CB 精密面取り工具トグロン シャンク径16mm]

100%正規品 【お値下げ】Edit&Co レディースカウチンジャケット ファー付き ファー付き ニット/セーター

今回は色々なデータを日付データに変換してみました。to_datetime関数はかなり柔軟に日付データに変換してくれるのでかなり使い勝手が良いと思います。

クレス カウンターチェア テモラカウンター L1・L2 Lタイプ(MN・MD) W505×D550×H230・1:630/2:650・960mm参考