Pandasで日付・時間データを自由自在に操る!文字列変換から年月日抽出まで徹底解説


 

Pandasでデータ分析を行う際、日付や時間のデータは非常に重要な要素です。しかし、CSVやデータベースから読み込んだデータは、日付が文字列形式だったり、時間情報が不足していたりすることも少なくありません。

Pandasは、このような**日付・時間データ(Datetime)**を効率的に処理するための強力な機能を提供しています。この記事では、文字列からDatetime型への変換、特定の要素(年、月、日など)の抽出、そしてDatetime型を文字列に戻す方法まで、具体的なコード例を交えながら丁寧に解説します。


 

日付・時間データ(Datetime型)の重要性

 

Pandasにおける日付・時間データは、datetime64[ns]という型で内部的に処理されます。この型に変換することで、以下のようなメリットがあります。

  • 時系列処理の容易さ: resample, rolling, shiftなどの時系列専用メソッドが使えるようになります。

  • 計算の正確性: 日付間の差分計算などが正確に行えます。

  • 柔軟な抽出・フィルタリング: 特定の期間や時刻でのデータ抽出が容易になります。

  • メモリ効率: 文字列で日付を保持するよりも効率的な場合があります。


 

文字列からDatetime型への変換: pd.to_datetime()

 

Pandasで日付・時間データを扱う際の第一歩は、文字列や数値で表現されたデータをDatetime型に変換することです。これには**pd.to_datetime()**関数を使用します。

 

基本的な使い方

 

最も一般的なのは、日付を表す文字列をDatetime型に変換するケースです。

Python
 
import pandas as pd

# 文字列のSeries
date_str_series = pd.Series(['2024-01-01', '2024/01/02', '2024年1月3日'])
print("元の文字列Series:\n", date_str_series)

# Datetime型に変換
datetime_series = pd.to_datetime(date_str_series)
print("\nDatetime型に変換:\n", datetime_series)
print("型:", datetime_series.dtype)

Pandasは様々な日付フォーマットを自動的に認識しようとしますが、認識できない場合はエラーになります。

 

format引数: 特定の書式を指定

 

もし日付文字列の形式が決まっている場合は、format引数で明示的に書式を指定することで、変換を高速化し、エラーを防ぐことができます。

Python
 
# 特定のフォーマットの文字列
date_str_with_format = pd.Series(['01-01-2024', '02-01-2024'])

# formatを指定して変換 (%d=日, %m=月, %Y=年)
datetime_formatted = pd.to_datetime(date_str_with_format, format='%d-%m-%Y')
print("\nformat指定で変換:\n", datetime_formatted)

よく使われる書式コードの例:

コード 説明
%Y 4桁の年 2024
%m 2桁の月 (01-12) 01
%d 2桁の日 (01-31) 01
%H 24時間表記の時間 (00-23) 13
%M 2桁の分 (00-59) 30
%S 2桁の秒 (00-59) 45
%f マイクロ秒 123456
%p AM/PM AM
%a 曜日の省略名 (Mon) Mon
%A 曜日の完全名 (Monday) Monday
%b 月の省略名 (Jan) Jan
%B 月の完全名 (January) January

 

エラー処理: errors引数

 

変換できない文字列が含まれる場合、デフォルトではエラーになりますが、errors引数で挙動を制御できます。

  • 'raise' (デフォルト): エラーを発生させる

  • 'coerce' : 変換できない値をNaT (Not a Time) に変換する

  • 'ignore' : エラーを無視し、元の文字列をそのまま返す(非推奨)

Python
 
# 変換できない文字列を含むSeries
invalid_date_str = pd.Series(['2024-01-01', '不正な日付', '2024-01-03'])

# errors='coerce'でNaTに変換
datetime_coerce = pd.to_datetime(invalid_date_str, errors='coerce')
print("\nエラー値をNaTに変換:\n", datetime_coerce)

 

Datetime型からの要素抽出: dtアクセサ

 

Datetime型に変換されたSeriesやDataFrameのインデックスからは、.dtアクセサを使って年、月、日、曜日などの個別の要素を簡単に抽出できます。

 

年、月、日、時間などの抽出

 

Python
 
# DatetimeIndexを持つSeries
dt_index_series = pd.Series(range(3), index=pd.to_datetime(['2024-01-15 10:30', '2024-02-20 14:00', '2024-03-25 18:45']))
print("元のDatetimeIndex Series:\n", dt_index_series)

# 年を抽出
print("\n年:", dt_index_series.index.year)

# 月を抽出
print("月:", dt_index_series.index.month)

# 日を抽出
print("日:", dt_index_series.index.day)

# 時間を抽出
print("時間 (時):", dt_index_series.index.hour)

# 曜日を抽出 (月曜日=0, 日曜日=6)
print("曜日 (数値):", dt_index_series.index.dayofweek)

# 曜日名 (英語) を抽出
print("曜日名:", dt_index_series.index.day_name())

 

四半期、週番号などの抽出

 

より高度な時間単位も抽出可能です。

Python
 
# 四半期を抽出
print("\n四半期:", dt_index_series.index.quarter)

# 年内の週番号を抽出 (ISO 8601準拠)
print("週番号:", dt_index_series.index.isocalendar().week) # .isocalendar().weekを使用

 

Datetime型から文字列への変換: .dt.strftime()

 

分析結果をレポートとして出力したり、特定のフォーマットで保存したりする際には、Datetime型を再び文字列に変換する必要がある場合があります。これには**.dt.strftime()**メソッドを使用します。

Python
 
# 先ほど作成したdatetime_seriesを使用
# datetime_series = pd.to_datetime(pd.Series(['2024-01-01', '2024/01/02', '2024年1月3日']))

# 'YYYY-MM-DD'形式の文字列に変換
str_format_ymd = datetime_series.dt.strftime('%Y-%m-%d')
print("\n'YYYY-MM-DD'形式に変換:\n", str_format_ymd)

# 'YYYY年MM月DD日 HH時MM分'形式の文字列に変換
str_format_jp = datetime_series.dt.strftime('%Y年%m月%d日 %H時%M分')
print("\n'YYYY年MM月DD日 HH時MM分'形式に変換:\n", str_format_jp)

strftimeで使用する書式コードは、pd.to_datetimeformat引数と同じものが使えます。


 

まとめ

 

Pandasで日付・時間データを扱うには、以下の3つの主要なステップを理解することが重要です。

  1. 文字列からの変換: **pd.to_datetime()**を使って、様々な形式の文字列をDatetime型に変換します。format引数で書式を指定し、errors='coerce'でエラーをハンドリングすることが重要です。

  2. 要素の抽出: Datetime型のSeriesやDatetimeIndexに対して**.dtアクセサ**を使用し、year, month, day, hour, day_name()などの属性で個別の時間要素を簡単に抽出します。

  3. 文字列への再変換: 分析結果の出力や保存時には、**.dt.strftime()**メソッドを使って、Datetime型を任意のフォーマットの文字列に戻します。

これらの機能をマスターすることで、Pandasでの時系列データ分析が格段にスムーズかつ効率的になります。ぜひ、ご自身のデータでこれらの操作を試してみてください!