Pandas pd.to_datetime() 関数
pd.to_datetime()はPandasライブラリで使用されるデータを日時型に変換するための関数です。文字列、Unixタイムスタンプなど様々な形式のデータをPandasのdatetime64型に変換できます。
日時処理はデータ分析における一般的なタスクであり、datetime型に変換すると、日付の抽出、時間演算、タイムゾーン処理などの操作を簡単に行えます。
単語の意味: to_datetime「日時に変換する」という意味で、様々な形式の時間データを標準のdatetimeオブジェクトに統一変換します。
基本構文とパラメータ
pd.to_datetime()はPandasライブラリのトップレベル関数で、様々な形式の時間データをdatetime型に変換するために使用します。
構文形式
pd.to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False, utc=False, format=None, unit='ns')
パラメータの説明
| パラメータ | 型 | 説明 |
|---|---|---|
| arg | 整数、浮動小数点数、文字列、datetime、リスト、Series | 日時型に変換するデータ。 |
| errors | 文字列 | エラー処理方法:'raise'(デフォルト)は例外を発生、'coerce'はNaTに変換、'ignore'は元のデータを返す。 |
| dayfirst | ブール値 | Trueの場合、日が月の前に来ます(例:01/02/2023 は2日を表す)。 |
| utc | ブール値 | Trueの場合、UTCタイムゾーンのdatetimeを返します。 |
| format | 文字列 | 日時形式を指定します。例:'%Y-%m-%d'。 |
| unit | 文字列 | argが数値の場合、単位を指定します:'D', 's', 'ms', 'us', 'ns'。 |
戻り値の説明
- 戻り値: datetime64型のSeriesを返します。
- 効果: 入力データをPandasのdatetime型に変換し、日時操作を容易にします。
例
簡単なものから複雑なものまで一連の例を通して、pd.to_datetime()の使い方を完全にマスターしましょう。
例1:基本の使い方 - 文字列を日時へ変換する
例
import pandas as pd
# 1. 日時文字列のSeriesを作成
dates = pd.Series([
'2023-01-01',
'2023-01-02',
'2023-01-03',
'2023-01-04',
'2023-01-05'
])
print("=== 元のSeries(型:", dates.dtype, ")===")
print(dates)
# 2. pd.to_datetime() を使用して日時型に変換
result = pd.to_datetime(dates)
print("\n=== pd.to_datetime() 変換後(型:", result.dtype, ")===")
print(result)
# 3. 複数の形式に対応
dates_mixed = pd.Series([
'2023-01-01',
'2023/02/03',
'01.04.2023',
'2023年05月06日'
])
print("\n=== 複数形式の自動解析 ===")
print(pd.to_datetime(dates_mixed))
# 4. 時刻情報を含む
dates_with_time = pd.Series([
'2023-01-01 12:30:45',
'2023-02-03 08:15:30'
])
result_datetime = pd.to_datetime(dates_with_time)
print("\n=== 時刻情報を含む ===")
print(result_datetime)
# 1. 日時文字列のSeriesを作成
dates = pd.Series([
'2023-01-01',
'2023-01-02',
'2023-01-03',
'2023-01-04',
'2023-01-05'
])
print("=== 元のSeries(型:", dates.dtype, ")===")
print(dates)
# 2. pd.to_datetime() を使用して日時型に変換
result = pd.to_datetime(dates)
print("\n=== pd.to_datetime() 変換後(型:", result.dtype, ")===")
print(result)
# 3. 複数の形式に対応
dates_mixed = pd.Series([
'2023-01-01',
'2023/02/03',
'01.04.2023',
'2023年05月06日'
])
print("\n=== 複数形式の自動解析 ===")
print(pd.to_datetime(dates_mixed))
# 4. 時刻情報を含む
dates_with_time = pd.Series([
'2023-01-01 12:30:45',
'2023-02-03 08:15:30'
])
result_datetime = pd.to_datetime(dates_with_time)
print("\n=== 時刻情報を含む ===")
print(result_datetime)
実行結果:
=== 原始 Series(类型: object )=== 0 2023-01-01 1 2023-01-02 2 2023-01-03 3 2023-01-04 4 2023-01-05 dtype: object === pd.to_datetime() 转换后(类型: datetime64[ns] )=== 0 2023-01-01 00:00:00 1 2023-01-02 00:00:00 2 2023-01-03 00:00:00 3 2023-01-04 00:00:00 4 2023-01-05 00:00:00 === 多种格式自动解析 === 0 2023-01-01 00:00:00 1 2023-02-03 00:00:00 2 2023-04-01 00:00:00 3 2023-05-06 00:00:00 === 包含时间的信息 === 0 2023-01-01 12:30:45 1 2023-02-03 08:15:30
コード解説:
pd.to_datetime()一般的な日時形式を自動的に認識できます。- 入力が日付のみの場合でも、時刻部分はデフォルトで00:00:00に設定されます。
- 中国語、ドット、スラッシュなど様々な区切り文字を含む日付形式を処理できます。
例2:異なる日付形式とdayfirstパラメータの処理
地域によって異なる日付形式には、dayfirstパラメータまたはformatパラメータを使用できます。
例
import pandas as pd
# 1. ヨーロッパ形式の日付(月/日/年)
europe_dates = pd.Series(['01/02/2023', '02/03/2023', '03/04/2023'])
print("=== ヨーロッパ形式の日付(01/02/2023 を2日として解釈)===")
print("デフォルト(月/日/年):", pd.to_datetime(europe_dates).dt.day.tolist())
print("dayfirst=True:", pd.to_datetime(europe_dates, dayfirst=True).dt.day.tolist())
# 2. formatパラメータを使用して具体的な形式を指定
print("\n=== formatパラメータの使用 ===")
result = pd.to_datetime('2023-06-15 14:30:00', format='%Y-%m-%d %H:%M:%S')
print(f"変換結果: {result}")
# 3. 複雑な形式の解析
complex_dates = pd.Series(['2023年12月25日', '15/08/2023', '2023-05-01'])
print("\n=== 混合形式の自動解析 ===")
print(pd.to_datetime(complex_dates, dayfirst=True))
# 1. ヨーロッパ形式の日付(月/日/年)
europe_dates = pd.Series(['01/02/2023', '02/03/2023', '03/04/2023'])
print("=== ヨーロッパ形式の日付(01/02/2023 を2日として解釈)===")
print("デフォルト(月/日/年):", pd.to_datetime(europe_dates).dt.day.tolist())
print("dayfirst=True:", pd.to_datetime(europe_dates, dayfirst=True).dt.day.tolist())
# 2. formatパラメータを使用して具体的な形式を指定
print("\n=== formatパラメータの使用 ===")
result = pd.to_datetime('2023-06-15 14:30:00', format='%Y-%m-%d %H:%M:%S')
print(f"変換結果: {result}")
# 3. 複雑な形式の解析
complex_dates = pd.Series(['2023年12月25日', '15/08/2023', '2023-05-01'])
print("\n=== 混合形式の自動解析 ===")
print(pd.to_datetime(complex_dates, dayfirst=True))
実行結果:
=== 欧洲格式日期(01/02/2023 理解为 2 号)=== 默认: [1, 2, 3] dayfirst=True: [2, 3, 4] === 使用 format 参数 === 转换结果: 2023-06-15 14:30:00 === 混合格式自动解析 === 0 2023-12-25 00:00:00 1 2023-08-15 00:00:00 2 2023-05-01 00:00:00
コード解説:
formatパラメータで具体的な形式を指定すると、Pandasに日付の解析方法を明確に伝え、曖昧さを避けられます。- 自動解析の能力は高いですが、曖昧な場合(01/02/2023の解釈など)は、
dayfirst或formatパラメータで明確に指定する必要があります。
例3:Unixタイムスタンプを日時へ変換する
データベースやシステムからエクスポートされたタイムスタンプは、unitパラメータで変換できます。
例
import pandas as pd
# 1. Unixタイムスタンプ(秒)
timestamps = pd.Series([1672531200, 1672617600, 1672704000])
print("=== Unixタイムスタンプ(秒)===")
print(timestamps.values)
# 2. 日時に変換
result = pd.to_datetime(timestamps, unit='s')
print("\n=== pd.to_datetime(..., unit='s') 変換後 ===")
print(result)
# 3. Unixタイムスタンプ(ミリ秒)
timestamps_ms = pd.Series([1672531200000, 1672617600000, 1672704000000])
result_ms = pd.to_datetime(timestamps_ms, unit='ms')
print("\n=== ミリ秒タイムスタンプ ===")
print(result_ms)
# 4. 固定の原点から変換
print("\n=== 2023-01-01 からの計算 ===")
days = pd.Series([0, 1, 2, 3, 4])
result_origin = pd.to_datetime(days, origin='2023-01-01', unit='D')
print(result_origin)
# 1. Unixタイムスタンプ(秒)
timestamps = pd.Series([1672531200, 1672617600, 1672704000])
print("=== Unixタイムスタンプ(秒)===")
print(timestamps.values)
# 2. 日時に変換
result = pd.to_datetime(timestamps, unit='s')
print("\n=== pd.to_datetime(..., unit='s') 変換後 ===")
print(result)
# 3. Unixタイムスタンプ(ミリ秒)
timestamps_ms = pd.Series([1672531200000, 1672617600000, 1672704000000])
result_ms = pd.to_datetime(timestamps_ms, unit='ms')
print("\n=== ミリ秒タイムスタンプ ===")
print(result_ms)
# 4. 固定の原点から変換
print("\n=== 2023-01-01 からの計算 ===")
days = pd.Series([0, 1, 2, 3, 4])
result_origin = pd.to_datetime(days, origin='2023-01-01', unit='D')
print(result_origin)
実行結果:
=== Unix 时间戳(秒)=== [1672531200 1672617600 1672704000] === pd.to_datetime(..., unit='s') 转换后 === 0 2023-01-01 00:00:00 1 2023-01-02 00:00:00 2 2023-01-03 00:00:00 === 毫秒级时间戳 === 0 2023-01-01 00:00:00 1 2023-01-02 00:00:00 2 2023-01-03 00:00:00 === 从 2023-01-01 开始计算 === 0 2023-01-01 1 2023-01-02 2 2023-01-03 3 2023-01-04 4 2023-01-05
コード解説:
unit='s'数値の単位が秒(Unixタイムスタンプ)であることを示します。unit='ms'ミリ秒タイムスタンプを示します。originパラメータで開始時間を指定でき、相対時間の計算に使用できます。
例4:errorsパラメータで無効な日付を処理する
例
import pandas as pd
import numpy as np
# 1. 無効な日付を含むSeries
mixed_dates = pd.Series(['2023-01-01', '2023-02-30', 'invalid', '2023-03-15'])
print("=== 無効な日付を含むSeries ===")
print(mixed_dates)
# 2. errors='raise'(デフォルト)- 例外を発生
print("\n=== errors='raise' ===")
try:
pd.to_datetime(mixed_dates, errors='raise')
except Exception as e:
print(f"例外: {type(e).__name__}")
# 3. errors='coerce' - 無効な日付をNaTに変換
print("\n=== errors='coerce' ===")
result = pd.to_datetime(mixed_dates, errors='coerce')
print(result)
# 4. errors='ignore' - そのまま保持
print("\n=== errors='ignore' ===")
result_ignore = pd.to_datetime(mixed_dates, errors='ignore')
print(result_ignore)
print(f"型: {result_ignore.dtype}")
import numpy as np
# 1. 無効な日付を含むSeries
mixed_dates = pd.Series(['2023-01-01', '2023-02-30', 'invalid', '2023-03-15'])
print("=== 無効な日付を含むSeries ===")
print(mixed_dates)
# 2. errors='raise'(デフォルト)- 例外を発生
print("\n=== errors='raise' ===")
try:
pd.to_datetime(mixed_dates, errors='raise')
except Exception as e:
print(f"例外: {type(e).__name__}")
# 3. errors='coerce' - 無効な日付をNaTに変換
print("\n=== errors='coerce' ===")
result = pd.to_datetime(mixed_dates, errors='coerce')
print(result)
# 4. errors='ignore' - そのまま保持
print("\n=== errors='ignore' ===")
result_ignore = pd.to_datetime(mixed_dates, errors='ignore')
print(result_ignore)
print(f"型: {result_ignore.dtype}")
実行結果:
=== 包含无效日期的 Series === 0 2023-01-01 1 2023-02-30 2 invalid 3 2023-03-15 === errors='raise' === 异常: OutOfBoundsDatetime === errors='coerce' === 0 2023-01-01 00:00:00 1 NaT 2 NaT 3 2023-03-15 00:00:00 === errors='ignore' === 0 2023-01-01 1 2023-02-30 2 invalid 3 2023-03-15 dtype: object
コード解説:
errors='coerce'無効な日付や解析できない値をNaT(Not a Time、欠損値と同等)に変換します。- これはダーティデータを処理する際に非常に便利で、データ処理の連続性を維持できます。
注意事項
重要なヒント:
- データにdatetimeの範囲を超える値がある場合、
OutOfBoundsDatetime例外が発生します。formatパラメータで日付形式を明確に指定できるため、大量のデータを処理する際はパフォーマンス向上のために使用することをお勧めします。- 変換後のdatetimeオブジェクトは、
.dtアクセサを使用して豊富な日時操作を行うことができます。- タイムゾーン処理には
pytzライブラリのインストールが必要です。
その他の拡張
Pandas よく使う関数