【Python入門】日付と時刻を簡単操作! datetime モジュールの使い方を機械学習講師が解説!

日付と時刻を簡単操作! datetime モジュールの使い方を機械学習講師が解説!

Python で日付や時間を扱う際には、datetime モジュールが非常に便利です。このモジュールを使用することで、現在の日付や時刻の取得、計算、比較、さらには日付や時刻のフォーマット変換まで、様々な操作を簡単に行うことが可能です。

日時の計算は、例えば、現在の日時や特定の日時から過去や未来の日付を計算する場合や、 2 つの日付や時刻の差を求めて、その間の日数や時間を求めたりすることも容易です。

タイムゾーンに対応した操作も可能で、UTC(協定世界時)を基準とした日時の取得や、タイムゾーンの違いを考慮した日時の変換など、グローバルなアプリケーションでも役立つ機能も含まれています。

それでは、ちょっと長い記事となりますが、実際にひとつずつ学んでいきましょう。

datetime オブジェクトの基本

datetime オブジェクトの作成

まずは、datetime オブジェクトを作成してみましょう。datetime.now() を使うことで、現在日時を取得して datetime オブジェクトを作成できます。

Python
from datetime import datetime

# 現在の日時を取得
now = datetime.now()

print(now)
実行結果
2024-12-01 12:34:56.123456

時刻までは不要で、日付だけを取得したい場合は、date.today() を使います。

Python
from datetime import date

# 現在の日付を取得
today = date.today()

print(today)
実行結果
2024-12-01

指定した日時の datetime オブジェクトを作成することもできます。ここでは、年、月、日、時、分まで指定していますが、秒・マイクロ秒まで詳細に指定することも可能です。

Python
from datetime import datetime

# 指定した日時のdatetimeオブジェクトを作成
custom_datetime = datetime(2024, 12, 1, 14, 30)

print(custom_datetime)
実行結果
2024-12-01 14:30:00

datetime モジュールの strptime() メソッドを使うと、文字列から datetime オブジェクトを作成することができます。指定したフォーマットに基づいて、文字列から datetime オブジェクトを作成できます。

下記の例では、日付と時刻を含む文字列(”2024-09-29 14:30:45″)にフォーマット情報を与えて、datetime オブジェクトを作成しています。

Python
from datetime import datetime

# 文字列をdatetimeオブジェクトに変換
date_string = "2024-12-01 14:30:45"
date_format = "%Y-%m-%d %H:%M:%S"
converted_datetime = datetime.strptime(date_string, date_format)

print(converted_datetime)
実行結果
2024-12-01 14:30:45

datetime オブジェクトの表示

datetime オブジェクトからは、年、月、日、時、分、秒などの値を個別に取り出すことができます。

Python
from datetime import datetime

dt = datetime(2024, 12, 1, 14, 30, 10)

# 年月日、時刻を取得
year = dt.year
month = dt.month
day = dt.day
hour = dt.hour
minute = dt.minute
second = dt.second

# 結果を表示
print(f"{year}年{month}月{day}日")
print(f"{hour}時{minute}分{second}秒")
実行結果
2024年12月1日
14時30分10秒

datetime モジュールでは、年、月、日、時、分、秒といった基本的な日時情報に加えて、マイクロ秒や曜日といった情報も取得できます。曜日は、weekday() メソッドを使うことで、0 から 6 までの整数値として取得できます。0 が月曜日、6 が日曜日を意味します。また、strftime(‘%A’) を使うことで、曜日を文字列(例: Monday , Sunday )としても取得可能です。

Python
from datetime import datetime

# 現在の日時を取得
now = datetime.now()

# 年月日、時刻、マイクロ秒、曜日を取得
year = now.year
month = now.month
day = now.day
hour = now.hour
minute = now.minute
second = now.second
microsecond = now.microsecond
weekday = now.weekday()  # 曜日(0が月曜日、6が日曜日)
weekday_name = now.strftime('%A')  # 曜日名

# 結果を表示
print(f"{year}年{month}月{day}日")
print(f"{hour}時{minute}分{second}秒{microsecond}マイクロ秒")
print(f"今日は曜日番号 {weekday} です")
print(f"曜日名: {weekday_name}")
実行結果
2024年12月1日
7時5分10秒168348マイクロ秒
今日は曜日番号 6 です
曜日名: Sunday

Sunday ではなく、日曜日といった日本語の曜日名を表示させるには、次のような方法があります。

まず、weekday() メソッドを使用して、datetime オブジェクトから曜日を 0(=月曜日)から 6(=日曜日)までの整数として取得します。その後、あらかじめ定義した日本語の曜日名リストと対応させて、該当する曜日を表示させます。具体的なコードは以下のようになります。

Python
from datetime import datetime

days_japanese = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日']

dt = datetime(2024, 12, 1, 14, 30, 10)

# 年月日、時刻、マイクロ秒、曜日を取得
year = dt.year
month = dt.month
day = dt.day
hour = dt.hour
minute = dt.minute
second = dt.second
microsecond = dt.microsecond
weekday = dt.weekday()  # 曜日(0が月曜日、6が日曜日)
weekday_name = dt.strftime('%A')  # 曜日名
weekday_jp = days_japanese[dt.weekday()]

# 結果を表示
print(f"{year}年{month}月{day}日")
print(f"{hour}時{minute}分{second}秒{microsecond}マイクロ秒")
print(f"今日は曜日番号 {weekday} です")
print(f"曜日名: {weekday_name}")
print(f"曜日名(日本語): {weekday_jp}")
実行結果
2024年12月1日
14時30分10秒0マイクロ秒
今日は曜日番号 6 です
曜日名: Sunday
曜日名(日本語): 日曜日

datetime モジュールの strftime() メソッドを使うことで、datetime オブジェクトの日付や時刻を、指定したフォーマットに基づいて文字列に変換できます。たとえば、年、月、日、時刻などを自由にカスタマイズして表示することが可能です。

Python
from datetime import datetime

dt = datetime(2024, 12, 1, 14, 30, 10)

formatted_date = dt.strftime('%Y-%m-%d %H:%M:%S (%A)')
print(formatted_date)
実行結果
2024-12-01 14:30:10 (Sunday)

よく使うフォーマットとしては下記が挙げられます。

datetime オブジェクトの変更

書式意味
%Y西暦 ( 4桁) の 10 進表記を表します。2024
%y0 埋めした 10 進数で表記した世紀無しの年。24
%m0 埋めした 10 進数で表記した月。01
%d0 埋めした 10 進数で表記した月中の日にち。01
%Aロケールの曜日名を表示します。Sunday
%H0 埋めした 10 進数で表記した時 ( 24 時間表記)。00
%I0 埋めした 10 進数で表記した時 ( 12 時間表記)。01
%pロケールの AM もしくは PM と等価な文字列になります。AM
%M0 埋めした 10 進数で表記した分。00
%S0 埋めした 10 進数で表記した秒。00
%f10 進数で表記したマイクロ秒 ( 6 桁に 0 埋めされます)。000000

replace() メソッドを使うと、既存の datetime オブジェクトの特定の要素(年、月、日、時、分、秒、マイクロ秒)を変更した新しい datetime オブジェクトを作成することができます。これにより、元の日時情報を基にしながら、特定の要素だけを変更することが可能です。

Python
from datetime import datetime

# 指定した日時のdatetimeオブジェクトを作成
custom_datetime = datetime(2024, 12, 1, 14, 30)

# 日を4に、時を0に変更
custom_datetime_modified = custom_datetime.replace(day=4, hour=0)

# 結果を表示
print(f"{custom_datetime_modified.year}年{custom_datetime_modified.month}月{custom_datetime_modified.day}日")
print(f"{custom_datetime_modified.hour}時{custom_datetime_modified.minute}分{custom_datetime_modified.second}秒{custom_datetime_modified.microsecond}マイクロ秒")
実行結果
2024年12月4日
0時30分0秒0マイクロ秒

日時の計算

timedelta は、Python の datetime モジュールに含まれるクラスで、日付や時間の差(期間)を表現するためのものです。特定の日付や時刻に対して、日数や時間の加減算を行う際に非常に便利です。

timedelta は、日数、時間、分、秒といった単位で時間の間隔を表現します。datetime オブジェクトに対して加算や減算を行うことで、指定した期間分だけ日時を操作することができます。

日付の加算・減算を行ってみます。

Python
from datetime import date, timedelta

# 現在の日付を取得
today = date.today()

# 1日加算
tomorrow = today + timedelta(days=1)

# 7日前
last_week = today - timedelta(days=7)

print(f"Today: {today}")
print(f"Tomorrow: {tomorrow}")
print(f"7 days ago: {last_week}")
実行結果
Today: 2024-12-01
Tomorrow: 2024-12-02
7 days ago: 2024-11-24

続いて、時分の加算・減算を行ってみます。

Python
from datetime import datetime, timedelta

# 現在の日時を取得
now = datetime.now()

# 2時間加算
two_hours_later = now + timedelta(hours=2)

# 30分減算
thirty_minutes_ago = now - timedelta(minutes=30)

print(f"Now: {now}")
print(f"Two hours later: {two_hours_later}")
print(f"30 minutes ago: {thirty_minutes_ago}")
実行結果
Now: 2024-12-01 14:30:00.678706
Two hours later: 2024-12-01 16:30:00.678706
30 minutes ago: 2024-12-01 14:00:00.678706

以下に、2つの日付や時刻の差を求め、その間の日数や時間数を計算するコードを示します。

2つの日時の差を格納した difference 変数は timedelta オブジェクトになります。このオブジェクトは、日数や秒数などの情報を持っています。

Python
from datetime import datetime

# 2つの日時を定義
date1 = datetime(2024, 12, 1, 14, 30, 0)  # 2024年12月1日 14時30分00秒
date2 = datetime(2024, 11, 21, 8, 45, 0)   # 2024年11月21日 8時45分00秒

# 2つの日時の差を計算
difference = date2 - date1

# 日数と時間数を計算
days_diff = difference.days
hours_diff = difference.total_seconds() // 3600  # 秒数を時間に変換

# 結果を表示
print(f"2つの日付の差: {difference}")
print(f"日数の差: {days_diff}日")
print(f"時間の差: {hours_diff}時間")
実行結果
2つの日付の差: -11 days, 18:15:00
日数の差: -11日
時間の差: -246.0時間

ここまで見てきた、timedelta は、月(28~31日を取りうる)や年と言った変動する日時の操作を行うことはできません。

一方、relativedelta は、柔軟な期間の計算を可能にするクラスで、特に月や年などの可変的な期間を操作する場合に使います。例えば、「1年3ヶ月後」や「次の月の初日」などの計算が可能になります。

Python
from datetime import datetime
from dateutil.relativedelta import relativedelta

# 現在の日付
dt = datetime(2024, 12, 1, 14, 30)

# 1年3ヶ月後の日時を計算
future_date = dt + relativedelta(years=1, months=3)
print(f"1 year and 3 months later: {future_date}")

# 翌月の最初の日を計算
next_month_start = dt + relativedelta(day=1, months=+1)
print(f"Start of next month: {next_month_start}")
実行結果
1 year and 3 months later: 2026-03-01 14:30:00
Start of next month: 2025-01-01 14:30:00

日時の比較

datetime オブジェクト同士は比較演算子(==, !=, <, >, <=, >=)を使って比較することができます。datetimeオブジェクト同士を比較することで、日付や時刻が同じか、どちらが先か後かといった関係を簡単に確認できます。

Python
from datetime import datetime

# 2つの日時を作成
datetime1 = datetime(2024, 12, 1, 14, 30)
datetime2 = datetime(2024, 12, 1, 16, 45)

# 比較
print(datetime1 == datetime2)  # False
print(datetime1 != datetime2)  # True
print(datetime1 < datetime2)   # True
print(datetime1 > datetime2)   # False
実行結果
False
True
True
False

年、月、日、時のみを基に比較を行う場合、datetime.replace() メソッドを使って不要な要素をゼロに置き換え、比較を行うことができます。

Python
from datetime import datetime

# 2つのdatetimeオブジェクトを作成
datetime1 = datetime(2024, 12, 1, 14, 45, 30)  # 分: 45, 秒: 30
datetime2 = datetime(2024, 12, 1, 14, 15, 45)  # 分: 15, 秒: 45

# 分・秒を0に置き換えて比較
datetime1_trimmed = datetime1.replace(minute=0, second=0, microsecond=0)
datetime2_trimmed = datetime2.replace(minute=0, second=0, microsecond=0)

# 結果を表示
print(f"datetime1: {datetime1_trimmed}")
print(f"datetime2: {datetime2_trimmed}")

# 比較
if datetime1_trimmed == datetime2_trimmed:
    print("日時は分・秒を無視すると等しいです。")
else:
    print("日時は異なります。")
実行結果
datetime1: 2024-12-01 14:00:00
datetime2: 2024-12-01 14:00:00
日時は分・秒を無視すると等しいです。

calendar モジュール

calendar モジュールは、カレンダーに関連する操作を行うための標準ライブラリです。このモジュールを使うと、特定の年や月のカレンダーの生成、曜日や閏年の判定、日付の操作など、カレンダーに関連するさまざまな機能を提供します。calendar モジュールは、日時の計算や表示を行う際に便利です。calendar モジュールの活用例を見てみましょう。

monthrange() を利用し、指定した月の月末の日付を取得することができます。

Python
import calendar
from datetime import datetime

# 任意の年月を指定
year = 2024
month = 11

# 月末の日付を取得
_, last_day = calendar.monthrange(year, month)
last_date = datetime(year, month, last_day)

print(f"Last date of the month: {last_date}")
実行結果
Last date of the month: 2024-11-30 00:00:00

weekday() を利用し、指定した年月日の曜日を数値で取得できます(0が月曜日、6が日曜日)。

Python
import calendar

# 2024年12月1日の曜日を取得 (0=月曜日, 6=日曜日)
day_of_week = calendar.weekday(2024, 12, 1)
print(f"2024年12月1日は曜日番号: {day_of_week}")
実行結果
2024年12月1日は曜日番号: 6

isleap() を利用し、指定した年がうるう年かどうかを判定できます。

Python
import calendar

# 年を指定
year = 2024

# 閏年かどうかを確認
is_leap = calendar.isleap(year)

print(f"{year} is a leap year: {is_leap}")
実行結果
2024 is a leap year: True

monthcalendar() を利用し、その月の各週をリスト形式で取得できます。このリストを使って、第3日曜日を取得するといったこともできます。

Python
import calendar

def get_week_sunday(year, month, week):
    # 月のカレンダーを取得(各週をリストで表現)
    month_calendar = calendar.monthcalendar(year, month)
    
    # 月のカレンダーの各週をチェック
    sundays = [week[calendar.SUNDAY] for week in month_calendar if week[calendar.SUNDAY] != 0]
    
    # 第week週の日曜日を返す
    return sundays[week-1]  # 第3日曜日はリストの2番目の要素(0から数える)

# 2024年10月の第3日曜日を取得
third_sunday = get_week_sunday(2024, 12, 3)
print(f"2024年12月の第3日曜日は: 12月{third_sunday}日です")
実行結果
2024年12月の第3日曜日は: 12月15日です

日時操作の活用例

ここでは、さまざまな場面で役立つ日時操作の応用例を紹介します。日常的なプログラミングに役立つ例を中心に解説していきます。

活用例:第3日曜日を取得

特定の月における第3日曜日を返す関数について、calendar を使わない別解を作ってみます。

Python
from datetime import datetime, timedelta

def get_nth_weekday(year, month, weekday, n):
    # 月初の日付を取得
    first_day = datetime(year, month, 1)
    
    # その月の最初の指定された曜日を見つける
    days_ahead = (weekday - first_day.weekday() + 7) % 7
    first_weekday = first_day + timedelta(days=days_ahead)
    
    # 第n指定曜日を取得
    nth_weekday = first_weekday + timedelta(weeks=n-1)
    
    return nth_weekday

# 2024年12月の第3日曜日を取得(weekday=6は日曜日)
third_sunday = get_nth_weekday(2024, 12, 6, 3)

print(f"Third Sunday: {third_sunday}")
実行結果
Third Sunday: 2024-12-15 00:00:00

活用例:翌月月初の日付を取得

指定された日付から翌月の 1 日の日付を取得する関数を作成してみます。

Python
from datetime import datetime, timedelta

def get_first_day_of_next_month(date):
    # 翌月を計算
    if date.month == 12:
        # 12月の場合は翌年の1月
        next_month = 1
        next_year = date.year + 1
    else:
        next_month = date.month + 1
        next_year = date.year

    # 翌月の1日を返す
    return datetime(next_year, next_month, 1)

# 現在の日時から翌月の1日を取得
dt = datetime(2024, 12, 1)
next_month_first_day = get_first_day_of_next_month(dt)

print(f"First day of next month: {next_month_first_day}")
実行結果
First day of next month: 2025-01-01 00:00:00

活用例:経過日数・カウントダウンの日数計算

現在の日付を基に、今年の開始日から今日までの日数と、今日から年末までの日数を計算してみます。

Python
from datetime import datetime

dt = datetime(2024, 12, 1)

# 今年の年初と年末を定義
start_of_year = datetime(dt.year, 1, 1)
end_of_year = datetime(dt.year, 12, 31)

# 年始からの日数
days_from_start = (dt - start_of_year).days

# 年末までの日数
days_until_end = (end_of_year - dt).days

print(f"Days since start of the year: {days_from_start}")
print(f"Days until end of the year: {days_until_end}")
実行結果
Days since start of the year: 335
Days until end of the year: 30

活用例:年の第何週目であるかを取得

今日が今年の第何週目かを取得することができます。

isocalendar() を使うと、年、週番号、曜日番号を取得することができます。

Python
from datetime import datetime

dt = datetime(2024, 12, 1)

# 今日がISOカレンダーの第何週かを取得
year, week_num, weekday = dt.isocalendar()

print(f"Today is in week {week_num} of the year {year}")
実行結果
Today is in week 48 of the year 2024

活用例:翌金曜日などの取得

指定された日付から次の特定の曜日の日付を計算する関数 next_weekday() を定義し、使用しています。たとえば、「次の金曜日」のように、特定の曜日の日付を取得したい場合に便利です。

Python
from datetime import datetime, timedelta

def next_weekday(d, weekday):
    # dは現在の日付、weekdayは曜日(0=月曜日, 6=日曜日)
    days_ahead = weekday - d.weekday()
    if days_ahead <= 0:  # すでに今週のその曜日を過ぎている場合は翌週にする
        days_ahead += 7
    return d + timedelta(days=days_ahead)

dt = datetime(2024, 12, 1)

# 次の金曜日の日付を取得(weekday=4は金曜日)
next_friday = next_weekday(dt, 4)

print(f"Next Friday is on {next_friday}")
実行結果
Next Friday is on 2024-12-06 00:00:00

タイムゾーン

世界各地はそれぞれの時差を持っており、タイムゾーンとは、地域ごとに設定された標準時のことを指します。通常、タイムゾーンは協定世界時(UTC)を基準にして、プラスまたはマイナス何時間のオフセットであるかで表現されます。

例えば、日本標準時(JST)は、UTC+9で、UTC より 9 時間進んでいます。このようなタイムゾーンの概念は、異なる地域や国で日時を扱う際に重要になります。プログラミングにおいても、日時を正確に管理するためにはタイムゾーンの取り扱いが重要です。

Python では、datetime モジュールを使ってタイムゾーンを設定することができます。以下のコードでは、日本標準時(JST, UTC+9)を設定し、現在の日時をそのタイムゾーンで取得する方法を示しています。

timezone、timedelta を組み合わせることで、UTC からのオフセットを設定し、特定のタイムゾーンでの日時を簡単に操作できます。timedelta は、時間差や期間を表現するためのクラスで、日時の加算・減算、timezone オブジェクトのオフセット指定に使えます。

Python
from datetime import datetime, timezone, timedelta

# UTC+9(日本時間)のタイムゾーンを作成
jst = timezone(timedelta(hours=9))

# 現在の日時をUTC+9で表示
now_jst = datetime.now(jst)

print(now_jst)
実行結果
2024-12-01 07:52:27.083926+09:00

datetime モジュールを使用して、現在の UTC 時刻の取得および日本標準時( JST , UTC+9 )に基づいた日時の取得と、その日時を再度 UTC に変換する方法を示しています。タイムゾーン間での日時の変換を理解するための例です。

astimezone() メソッドは、既存の datetime オブジェクトを、指定したタイムゾーンに変換するためのメソッドです。このメソッドを使うことで、あるタイムゾーンの日時を別のタイムゾーンの日時に簡単に変換できます。

Python
from datetime import datetime, timezone, timedelta

# 現在のUTC時刻を取得
now_utc = datetime.now(timezone.utc)
print(f"UTC time: {now_utc}")

# UTCを日本時間(JST)に変換
jst = timezone(timedelta(hours=9))
now_jst = now_utc.astimezone(jst)
print(f"JST time: {now_jst}")

# 日本時間(JST)をUTCに変換
now_utc_from_jst = now_jst.astimezone(timezone.utc)
print(f"Converted to UTC: {now_utc_from_jst}")
実行結果
UTC time: 2024-12-01 22:56:36.321981+00:00
JST time: 2024-12-02 07:56:36.321981+09:00
Converted to UTC: 2024-12-01 22:56:36.321981+00:00

dateutil モジュール

dateutil は、Python の標準ライブラリの拡張として提供される非常に便利なモジュールで、特に日時の操作やタイムゾーンの処理を強化する機能を提供します。datetime モジュールと組み合わせて使うことで、より柔軟かつ直感的に日時の処理を行うことができます。

dateutil を使えば、+9 のように数値でオフセットを指定する必要がなく、タイムゾーンの名前(Asia/Tokyo など)を直接使って日時を変換できます。これにより、タイムゾーンの操作がより直感的で簡単になります。

dateutil の tz を使って、タイムゾーンを日本標準時(JST)に直接設定してみます。このコードは、dateutil モジュールを使って、東京(Asia/Tokyo)の現在の時刻を取得し、それをニューヨーク(America/New_York)の時刻に変換する方法を示しています。タイムゾーン間での日時の変換を行う方法を理解するための例です。

Python
from datetime import datetime
from dateutil import tz

# タイムゾーンを取得
tokyo_tz = tz.gettz('Asia/Tokyo')
new_york_tz = tz.gettz('America/New_York')

# 現在の東京の時刻
now_tokyo = datetime.now(tokyo_tz)
print(f"Tokyo time: {now_tokyo}")

# 東京時間をニューヨーク時間に変換
now_ny = now_tokyo.astimezone(new_york_tz)
print(f"New York time: {now_ny}")
実行結果
Tokyo time: 2024-12-02 07:58:09.527716+09:00
New York time: 2024-12-01 17:58:09.527716-05:00

このコードは、dateutil モジュールを使用して、現在の UTC 時刻を取得し、それをシステムのローカルタイムに変換する方法を示しています。dateutil のタイムゾーン機能を使い、UTC からローカルタイムゾーンへの日時変換がどのように行われるかを説明する例です。

Python
from dateutil import tz
from datetime import datetime

# UTCの現在時刻
now_utc = datetime.now(tz=tz.UTC)

# システムのローカルタイムゾーンを取得
local_tz = tz.tzlocal()

# UTCをローカルタイムに変換
now_local = now_utc.astimezone(local_tz)
print(f"Local time: {now_local}")
実行結果
Local time: 2024-12-01 22:58:47.702045+00:00

pandas

pandas はデータ分析ライブラリであり、datetime オブジェクトを使うことで、日付や時刻に基づくデータを簡単に操作・表示することができます。

datetime 型の作成

ここでは、CSVファイルに日付列が含まれる場合に、その列を datetime 型に変換する方法をいくつか紹介します。

data.csv
date,value
2024-09-29,100
2024-09-30,200
2024-10-01,150

まず最初に、read_csv() を使って、読み込み時に直接 datetime 型に変換する方法です。

HTML
import pandas as pd

df = pd.read_csv('data.csv', parse_dates=['date'])

print(df.dtypes)
print(df.head())
実行結果
date     datetime64[ns]
value             int64
dtype: object

        date  value
0 2024-09-29    100
1 2024-09-30    200
2 2024-10-01    150

次に、CSVファイル読み込み後に、DataFrame の特定の列を指定して、datetime 型に変換する方法です。

Python
import pandas as pd

df = pd.read_csv('data.csv')

df['date'] = pd.to_datetime(df['date'])


print(df.dtypes)
print(df.head())
実行結果
date     datetime64[ns]
value             int64
dtype: object

        date  value
0 2024-09-29    100
1 2024-09-30    200
2 2024-10-01    150

最後に、時分を含む日時データを扱い、書式を指定して datetime 型に変換する場合の例です。

Python
import pandas as pd

data = {'date': ['2024/12/01 14:30:00', '2024/12/02 08:45:15', '2024/11/01 23:59:59']}
df = pd.DataFrame(data)

df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d %H:%M:%S')

print(df.dtypes)
print(df.head())
実行結果
date    datetime64[ns]
dtype: object

                 date
0 2024-12-01 14:30:00
1 2024-12-02 08:45:15
2 2024-11-01 23:59:59

活用例:フィルタリング

pandasの列を datetime 型に変換することで、多くの便利な機能や操作が可能になります。活用例をいくつか見ていきましょう。

まずは、pandas データフレーム内の日付を、日付範囲でフィルタリングする例です。時系列データの分析や期間ごとの集計に非常に便利です。pandas のこのような機能を活用することで、効率的なデータ操作が可能になります。

Python
import pandas as pd

df = pd.read_csv('data.csv')

# 日付範囲を指定してデータを抽出
start_date = '2024-09-30'
end_date = '2024-10-02'

filtered_df = df[(df['date'] >= start_date) & (df['date'] <= end_date)]
print(filtered_df)
実行結果
         date  value
1  2024-09-30    200
2  2024-10-01    150

活用例:リサンプリング

次に、日次データを週次データにリサンプリング(時系列データに対して、異なる時間間隔での再集計や再計算)し、値の合計を計算します。

resample を使うと、データの時間間隔を日次、週次、月次などに変更し、集計関数( sum や mean など)を適用することができます。時間間隔については、3日ごとや15分ごとなども指定できます。

下記のコードで、週ごとの集計時に設定される日付は、週の終了日となります。週の開始日にしたい場合には、インデックスを週の開始日に調整(6日前にシフト)させ、weekly_sum.index = weekly_sum.index – pd.offsets.Week(weekday=6) などで対応することができます。

また、resample(‘W’) は、週の終わりが日曜となります。週の終わりを土曜にしたい場合、resample(‘W-SAT’) などで対応することができます。

Python
import pandas as pd

# サンプルデータの作成
data = {
    'date': pd.date_range(start='2024-12-01', periods=10, freq='D'),  # 10日間の日付データ
    'value': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]  # サンプルの値
}
df = pd.DataFrame(data)

# 'date'列をインデックスに設定
df.set_index('date', inplace=True)

# 週ごとにリサンプリングして値の合計を計算
weekly_sum = df.resample('W').sum()

# 結果を表示
print("元のデータフレーム:\n", df)
print("\n週ごとの合計:\n", weekly_sum)
実行結果
元のデータフレーム:
             value
date             
2024-12-01     10
2024-12-02     20
2024-12-03     30
2024-12-04     40
2024-12-05     50
2024-12-06     60
2024-12-07     70
2024-12-08     80
2024-12-09     90
2024-12-10    100

週ごとの合計:
             value
date             
2024-12-01     10
2024-12-08    350
2024-12-15    190

活用例:日時演算

python の timedelta は、pandas の timedelta クラスとも統合されており、データフレーム内の日付に対して期間の加減算を行うことができます。Timedelta を使用することで、日付に対して柔軟に加算や減算を行うことができ、時系列データの分析や操作において非常に便利です。

Python
import pandas as pd

# サンプルデータの作成
data = {
    'date': pd.date_range(start='2024-12-01', periods=10, freq='D'),  # 10日間の日付データ
    'value': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]  # サンプルの値
}
df = pd.DataFrame(data)

# 1日を加算
df['date_plus_1_day'] = df['date'] + pd.Timedelta(days=1)

print(df)
実行結果
        date  value date_plus_1_day
0 2024-12-01     10      2024-12-02
1 2024-12-02     20      2024-12-03
2 2024-12-03     30      2024-12-04
3 2024-12-04     40      2024-12-05
4 2024-12-05     50      2024-12-06
5 2024-12-06     60      2024-12-07
6 2024-12-07     70      2024-12-08
7 2024-12-08     80      2024-12-09
8 2024-12-09     90      2024-12-10
9 2024-12-10    100      2024-12-11

pandas の Timedelta クラスを使用して、日付の操作(加算)を簡単に行っています。

Python
import pandas as pd

# サンプルデータを作成
date_range = pd.date_range(start='2024-12-01', periods=10, freq='D')
df = pd.DataFrame({'date': date_range, 'value': range(10)})

# 日付列をインデックスに設定
df.set_index('date', inplace=True)

print(df)

# 2日ごとの平均値を計算
resampled_df = df.resample('2D').mean()

print(resampled_df)
実行結果
            value
date             
2024-12-01      0
2024-12-02      1
2024-12-03      2
2024-12-04      3
2024-12-05      4
2024-12-06      5
2024-12-07      6
2024-12-08      7
2024-12-09      8
2024-12-10      9
            value
date             
2024-12-01    0.5
2024-12-03    2.5
2024-12-05    4.5
2024-12-07    6.5
2024-12-09    8.5

活用例:曜日情報の取得

datetime 型列では、曜日を取得することもできます。.dt.weekday により、曜日を 0 から 6 の整数で取得できます。0 が月曜日、6 が日曜日を意味します。

Python
import pandas as pd

# サンプルデータの作成
data = {
    'date': pd.to_datetime(['2024-12-01', '2024-12-02', '2024-12-03'])  # 日付データ
}
df = pd.DataFrame(data)

# 曜日を取得
df['weekday'] = df['date'].dt.weekday

print(df)
実行結果
        date  weekday
0 2024-12-01        6
1 2024-12-02        0
2 2024-12-03        1

活用例:ソート

pandas の sort_values() メソッドを使って、データフレーム の datetime 列を時間順に並べ替えを行うことができます。ここでは、時間順にデータを昇順で並べ替えます(古い日時から新しい日時へ)。

Python
import pandas as pd

# サンプルデータの作成
data = {
    'date': pd.to_datetime(['2024-12-05', '2024-12-01', '2024-12-03']),
    'value': [500, 100, 300]
}
df = pd.DataFrame(data)

# 'date'列に基づいて並べ替え
df_sorted = df.sort_values(by='date')

print(df_sorted)
実行結果
        date  value
1 2024-12-01    100
2 2024-12-03    300
0 2024-12-05    500

活用例:時系列データの可視化

このコードは、pandas と matplotlib を使用して、時系列データを簡単にプロットする方法を示しています。pandas のデータフレームを使うことで、日付をインデックスに設定し、簡単に時系列プロットが作成できます。また、matplotlib を使ってラベルやタイトルを設定し、グラフを視覚的に整えることができます。時系列データのプロットは、データの傾向や季節性、異常値などを視覚的に理解するのに非常に有用です。

Python
import pandas as pd
import matplotlib.pyplot as plt

# サンプルの時系列データを作成
date_range = pd.date_range(start='2024-12-01', periods=10, freq='D')
data = {'date': date_range, 'value': range(10)}
df = pd.DataFrame(data)

print(df)

# 日付列をインデックスに設定
df.set_index('date', inplace=True)

# 時系列データのプロット
df.plot()
plt.title("Time Series Plot")
plt.ylabel("Value")
plt.xlabel("Date")
plt.show()
実行結果
        date  value
0 2024-12-01      0
1 2024-12-02      1
2 2024-12-03      2
3 2024-12-04      3
4 2024-12-05      4
5 2024-12-06      5
6 2024-12-07      6
7 2024-12-08      7
8 2024-12-09      8
9 2024-12-10      9

このコードは、時系列データを pandas でリサンプリングし、集計結果を可視化する方法を示しています。リサンプリングは、データの粒度を変更してより広いスケールで分析したり、異なる時間間隔でのデータの傾向を理解するために非常に便利です。特に、pandas のリサンプリング機能と matplotlib を組み合わせることで、簡単に時系列データをプロットし、視覚的に分析することができます。

Python
# 3日ごとのデータにリサンプリングして平均値を計算
df_resampled = df.resample('3D').mean()

print(df_resampled)

# リサンプリングされたデータのプロット
df_resampled.plot()
plt.title("Resampled Time Series (3 Days)")
plt.ylabel("Average Value")
plt.xlabel("Date")
plt.show()
実行結果
            value
date             
2024-12-01    1.0
2024-12-04    4.0
2024-12-07    7.0
2024-12-10    9.0

このコードは、pandas の rolling() メソッドを使って移動平均を計算し、それを matplotlib でプロットする方法を示しています。移動平均は、データのノイズを軽減し、長期的なトレンドを把握するために非常に有用です。特に、金融データやセンサーデータの分析など、時系列データの解析に広く使用されます。この方法を使うことで、データの動向や変動のパターンを直感的に捉えることができます。

Python
# 移動平均を計算(3日間の移動平均)
df['moving_avg'] = df['value'].rolling(window=3).mean()

# 元データと移動平均をプロット
df[['value', 'moving_avg']].plot()
plt.title("Time Series with Moving Average")
plt.ylabel("Value")
plt.xlabel("Date")
plt.show()
実行結果
            value  moving_avg
date                         
2024-12-01      0         NaN
2024-12-02      1         NaN
2024-12-03      2         1.0
2024-12-04      3         2.0
2024-12-05      4         3.0
2024-12-06      5         4.0
2024-12-07      6         5.0
2024-12-08      7         6.0
2024-12-09      8         7.0
2024-12-10      9         8.0

さいごに

Python の datetime と pandas の datetime は、日付や時刻データの処理・解析において非常に強力なツールです。datetime モジュールを使えば、基本的な日時操作からタイムゾーン管理まで柔軟に行うことができ、大規模な時系列データやデータフレーム内の日付処理も効率的に行えます。実務やデータ分析の場面では、日時データを適切に扱うことがデータの精度や洞察の深さに直結します。

さらに、dateutil のようなライブラリや、リサンプリング、曜日抽出、タイムゾーン変換といった便利な機能を駆使することで、日時データを多角的に分析できる可能性が広がります。これらのスキルは、マーケティングや金融、IoT、季節予測といった多くの分野で応用が可能です。

今後、AI や機械学習との連携がますます進む中で、日時データの扱いは単なる記録ではなく、予測や異常検知、トレンド分析といった未来志向の活用が求められています。datetime の知識を基に、さらなるデータサイエンスの技術を習得することで、より高度なデータ解析やモデル構築に活かしていけるでしょう。