Pandasで日付・時間データを自由自在に操る!文字列変換から年月日抽出まで徹底解説
Pandasでデータ分析を行う際、日付や時間のデータは非常に重要な要素です。しかし、CSVやデータベースから読み込んだデータは、日付が文字列形式だったり、時間情報が不足していたりすることも少なくありません。
Pandasは、このような**日付・時間データ(Datetime)**を効率的に処理するための強力な機能を提供しています。この記事では、文字列からDatetime型への変換、特定の要素(年、月、日など)の抽出、そしてDatetime型を文字列に戻す方法まで、具体的なコード例を交えながら丁寧に解説します。
日付・時間データ(Datetime型)の重要性
Pandasにおける日付・時間データは、datetime64[ns]という型で内部的に処理されます。この型に変換することで、以下のようなメリットがあります。
-
時系列処理の容易さ:
resample,rolling,shiftなどの時系列専用メソッドが使えるようになります。 -
計算の正確性: 日付間の差分計算などが正確に行えます。
-
柔軟な抽出・フィルタリング: 特定の期間や時刻でのデータ抽出が容易になります。
-
メモリ効率: 文字列で日付を保持するよりも効率的な場合があります。
文字列からDatetime型への変換: pd.to_datetime()
Pandasで日付・時間データを扱う際の第一歩は、文字列や数値で表現されたデータをDatetime型に変換することです。これには**pd.to_datetime()**関数を使用します。
基本的な使い方
最も一般的なのは、日付を表す文字列をDatetime型に変換するケースです。
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引数で明示的に書式を指定することで、変換を高速化し、エラーを防ぐことができます。
# 特定のフォーマットの文字列
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': エラーを無視し、元の文字列をそのまま返す(非推奨)
# 変換できない文字列を含む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アクセサを使って年、月、日、曜日などの個別の要素を簡単に抽出できます。
年、月、日、時間などの抽出
# 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())
四半期、週番号などの抽出
より高度な時間単位も抽出可能です。
# 四半期を抽出
print("\n四半期:", dt_index_series.index.quarter)
# 年内の週番号を抽出 (ISO 8601準拠)
print("週番号:", dt_index_series.index.isocalendar().week) # .isocalendar().weekを使用
Datetime型から文字列への変換: .dt.strftime()
分析結果をレポートとして出力したり、特定のフォーマットで保存したりする際には、Datetime型を再び文字列に変換する必要がある場合があります。これには**.dt.strftime()**メソッドを使用します。
# 先ほど作成した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_datetimeのformat引数と同じものが使えます。
まとめ
Pandasで日付・時間データを扱うには、以下の3つの主要なステップを理解することが重要です。
-
文字列からの変換: **
pd.to_datetime()**を使って、様々な形式の文字列をDatetime型に変換します。format引数で書式を指定し、errors='coerce'でエラーをハンドリングすることが重要です。 -
要素の抽出: Datetime型のSeriesやDatetimeIndexに対して**
.dtアクセサ**を使用し、year,month,day,hour,day_name()などの属性で個別の時間要素を簡単に抽出します。 -
文字列への再変換: 分析結果の出力や保存時には、**
.dt.strftime()**メソッドを使って、Datetime型を任意のフォーマットの文字列に戻します。
これらの機能をマスターすることで、Pandasでの時系列データ分析が格段にスムーズかつ効率的になります。ぜひ、ご自身のデータでこれらの操作を試してみてください!

