【Python】日付(年月日)をdatetimeで扱う方法

この記事では、Pythonのdatetimeモジュールを使って、現在の日付と時刻を取得する方法、特定の日付と時刻を生成する方法、文字列から日付を作成する方法を学びます。

また、日付や時刻の要素を取得したり、日付の加算・減算を行ったり、日付を文字列に変換したりする方法も紹介します。

さらに、日付の比較や差分の計算、実際のアプリケーションで役立つバリデーションや範囲チェック、ソートの方法も解説します。

目次から探す

datetimeオブジェクトの生成

Pythonで日付や時刻を扱う際に便利なのがdatetimeモジュールです。

このモジュールを使うことで、現在の日付と時刻の取得や、特定の日付と時刻の生成、さらには文字列からの変換などが簡単に行えます。

ここでは、datetimeオブジェクトの生成方法について詳しく解説します。

現在の日付と時刻を取得する

現在の日付と時刻を取得するには、datetimeモジュールのdatetime.now()メソッドを使用します。

このメソッドは、現在のローカルな日付と時刻を含むdatetimeオブジェクトを返します。

from datetime import datetime
# 現在の日付と時刻を取得
now = datetime.now()
print(now)

上記のコードを実行すると、以下のような出力が得られます。

2023-10-05 14:23:45.123456

このように、datetime.now()を使うことで、簡単に現在の日付と時刻を取得することができます。

特定の日付と時刻を指定して生成する

特定の日付と時刻を指定してdatetimeオブジェクトを生成するには、datetimeクラスのコンストラクタを使用します。

コンストラクタには、年、月、日、時、分、秒、マイクロ秒を指定することができます。

from datetime import datetime
# 特定の日付と時刻を指定して生成
specific_date = datetime(2023, 10, 5, 14, 30, 0)
print(specific_date)

上記のコードを実行すると、以下のような出力が得られます。

2023-10-05 14:30:00

このように、datetimeクラスのコンストラクタを使うことで、任意の日付と時刻を簡単に生成することができます。

文字列からdatetimeオブジェクトを生成する

文字列からdatetimeオブジェクトを生成するには、datetimeモジュールのdatetime.strptime()メソッドを使用します。

このメソッドは、指定されたフォーマットに従って文字列を解析し、datetimeオブジェクトを返します。

from datetime import datetime
# 文字列からdatetimeオブジェクトを生成
date_string = "2023-10-05 14:30:00"
date_format = "%Y-%m-%d %H:%M:%S"
parsed_date = datetime.strptime(date_string, date_format)
print(parsed_date)

上記のコードを実行すると、以下のような出力が得られます。

2023-10-05 14:30:00

このように、datetime.strptime()メソッドを使うことで、文字列から簡単にdatetimeオブジェクトを生成することができます。

フォーマット指定子については、次のセクションで詳しく解説します。

datetimeオブジェクトの操作

日付や時刻の要素を取得する

datetimeオブジェクトから特定の要素(年、月、日、時、分、秒)を取得する方法について解説します。

年、月、日を取得する

datetimeオブジェクトから年、月、日を取得するには、それぞれ yearmonthday 属性を使用します。

以下の例を見てみましょう。

from datetime import datetime
# 現在の日付と時刻を取得
now = datetime.now()
# 年、月、日を取得
year = now.year
month = now.month
day = now.day
print(f"年: {year}, 月: {month}, 日: {day}")

このコードを実行すると、現在の年、月、日が表示されます。

時、分、秒を取得する

同様に、時、分、秒を取得するには、それぞれ hourminutesecond 属性を使用します。

以下の例を見てみましょう。

from datetime import datetime
# 現在の日付と時刻を取得
now = datetime.now()
# 時、分、秒を取得
hour = now.hour
minute = now.minute
second = now.second
print(f"時: {hour}, 分: {minute}, 秒: {second}")

このコードを実行すると、現在の時、分、秒が表示されます。

日付や時刻の加算・減算

datetimeオブジェクトに対して日付や時刻の加算・減算を行う方法について解説します。

timedeltaオブジェクトの利用

日付や時刻の加算・減算には、timedeltaオブジェクトを使用します。

timedeltaオブジェクトは、日付や時刻の差を表現するためのオブジェクトです。

以下の例では、1日を表すtimedeltaオブジェクトを作成し、それを現在の日付に加算しています。

from datetime import datetime, timedelta
# 現在の日付と時刻を取得
now = datetime.now()
# 1日を表すtimedeltaオブジェクトを作成
one_day = timedelta(days=1)
# 現在の日付に1日を加算
tomorrow = now + one_day
print(f"現在の日付: {now}")
print(f"1日後の日付: {tomorrow}")

このコードを実行すると、現在の日付と1日後の日付が表示されます。

日付の加算・減算の例

次に、具体的な日付の加算・減算の例を見てみましょう。

from datetime import datetime, timedelta
# 現在の日付と時刻を取得
now = datetime.now()
# 7日を表すtimedeltaオブジェクトを作成
one_week = timedelta(weeks=1)
# 現在の日付に7日を加算
next_week = now + one_week
# 現在の日付から7日を減算
last_week = now - one_week
print(f"現在の日付: {now}")
print(f"1週間後の日付: {next_week}")
print(f"1週間前の日付: {last_week}")

このコードを実行すると、現在の日付、1週間後の日付、1週間前の日付が表示されます。

このように、timedeltaオブジェクトを使用することで、簡単に日付や時刻の加算・減算を行うことができます。

datetimeオブジェクトのフォーマット

Pythonのdatetimeモジュールを使うと、日付や時刻をさまざまな形式でフォーマットすることができます。

ここでは、datetimeオブジェクトを文字列に変換する方法と、文字列をdatetimeオブジェクトに変換する方法について詳しく解説します。

datetimeオブジェクトを文字列に変換する

strftimeメソッドの使い方

datetimeオブジェクトを文字列に変換するためには、strftimeメソッドを使用します。

このメソッドは、指定したフォーマットに従ってdatetimeオブジェクトを文字列に変換します。

from datetime import datetime
# 現在の日時を取得
now = datetime.now()
# datetimeオブジェクトを文字列に変換
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_date)  # 例: 2023-10-05 14:30:00

上記の例では、%Y%m%d %H:%M:%Sというフォーマットを指定して、datetimeオブジェクトを「年-月-日 時:分:秒」の形式の文字列に変換しています。

フォーマット指定子の一覧

strftimeメソッドで使用できる主なフォーマット指定子は以下の通りです。

指定子説明
%Y西暦4桁2023
%y西暦下2桁23
%m月(ゼロ埋め)01, 12
%d日(ゼロ埋め)01, 31
%H時(24時間表記)00, 23
%I時(12時間表記)01, 12
%M00, 59
%S00, 59
%fマイクロ秒000000, 999999
%A曜日(英語)Monday
%a曜日(短縮形)Mon
%B月名(英語)January
%b月名(短縮形)Jan

これらの指定子を組み合わせることで、さまざまな形式の文字列に変換することができます。

文字列をdatetimeオブジェクトに変換する

strptimeメソッドの使い方

文字列をdatetimeオブジェクトに変換するためには、strptimeメソッドを使用します。

このメソッドは、指定したフォーマットに従って文字列を解析し、datetimeオブジェクトを生成します。

from datetime import datetime
# 文字列をdatetimeオブジェクトに変換
date_string = "2023-10-05 14:30:00"
date_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(date_object)  # 2023-10-05 14:30:00

上記の例では、%Y-%m-%d %H:%M:%Sというフォーマットを指定して、文字列をdatetimeオブジェクトに変換しています。

フォーマット指定子の利用例

以下に、いくつかのフォーマット指定子を使用した例を示します。

from datetime import datetime
# 例1: 年月日のみを含む文字列を解析
date_string1 = "2023-10-05"
date_object1 = datetime.strptime(date_string1, "%Y-%m-%d")
print(date_object1)  # 2023-10-05 00:00:00
# 例2: 時刻のみを含む文字列を解析
time_string = "14:30:00"
time_object = datetime.strptime(time_string, "%H:%M:%S")
print(time_object)  # 1900-01-01 14:30:00
# 例3: 英語の月名を含む文字列を解析
date_string2 = "October 5, 2023"
date_object2 = datetime.strptime(date_string2, "%B %d, %Y")
print(date_object2)  # 2023-10-05 00:00:00

これらの例では、異なるフォーマット指定子を使用して文字列をdatetimeオブジェクトに変換しています。

strptimeメソッドを使うことで、さまざまな形式の文字列を簡単に解析し、datetimeオブジェクトに変換することができます。

datetimeオブジェクトの比較

Pythonのdatetimeモジュールを使用すると、日付や時刻の比較が簡単に行えます。

ここでは、datetimeオブジェクトの比較演算と日付の差分を計算する方法について解説します。

datetimeオブジェクトの比較演算

datetimeオブジェクトは、比較演算子(<, <=, >, >=, ==, !=)を使用して直接比較することができます。

これにより、特定の日付や時刻が他の日付や時刻と比べて前か後か、または同じかどうかを簡単に判断できます。

以下に、datetimeオブジェクトの比較演算の例を示します。

from datetime import datetime
# 2つのdatetimeオブジェクトを生成
date1 = datetime(2023, 10, 1, 12, 0, 0)
date2 = datetime(2023, 10, 2, 12, 0, 0)
# 比較演算
print(date1 < date2)  # True
print(date1 <= date2) # True
print(date1 > date2)  # False
print(date1 >= date2) # False
print(date1 == date2) # False
print(date1 != date2) # True

この例では、date1date2という2つのdatetimeオブジェクトを生成し、それらを比較しています。

結果として、date1date2よりも前の日付であるため、date1 < date2Trueとなります。

日付の差分を計算する

datetimeオブジェクト同士の差分を計算するには、単純に引き算を行うことができます。

この操作の結果はtimedeltaオブジェクトとなり、日付や時刻の差分を表します。

以下に、日付の差分を計算する例を示します。

from datetime import datetime
# 2つのdatetimeオブジェクトを生成
date1 = datetime(2023, 10, 1, 12, 0, 0)
date2 = datetime(2023, 10, 2, 12, 0, 0)
# 日付の差分を計算
difference = date2 - date1
# 差分を表示
print(difference)           # 1 day, 0:00:00
print(difference.days)      # 1
print(difference.seconds)   # 0
print(difference.total_seconds()) # 86400.0

この例では、date1date2の差分を計算し、その結果をdifferenceというtimedeltaオブジェクトに格納しています。

differenceオブジェクトのdays属性を使用すると、日数の差分を取得できます。

また、seconds属性を使用すると、秒単位の差分を取得できます。

さらに、total_seconds()メソッドを使用すると、差分を秒単位で取得することができます。

これらの方法を使用することで、日付や時刻の比較や差分の計算が簡単に行えるようになります。

Pythonのdatetimeモジュールを活用して、日付や時刻の操作を効率的に行いましょう。

実用例

日付のバリデーション

日付のバリデーションは、ユーザーが入力した日付が正しい形式であるかどうかを確認するために重要です。

Pythonのdatetimeモジュールを使用すると、簡単に日付のバリデーションを行うことができます。

以下は、ユーザーが入力した日付が正しいかどうかを確認する例です。

from datetime import datetime
def validate_date(date_str):
    try:
        # 日付のフォーマットを指定して解析
        datetime.strptime(date_str, '%Y-%m-%d')
        return True
    except ValueError:
        return False
# テスト
print(validate_date('2023-10-01'))  # True
print(validate_date('2023-02-30'))  # False
print(validate_date('2023/10/01'))  # False

この例では、datetime.strptimeメソッドを使用して、日付文字列がYYYY-MM-DD形式であるかどうかを確認しています。

正しい形式であればTrueを返し、そうでなければFalseを返します。

日付の範囲チェック

日付の範囲チェックは、特定の期間内に日付が含まれているかどうかを確認するために使用されます。

例えば、イベントの開始日と終了日の間に日付が含まれているかどうかを確認する場合などです。

以下は、日付が特定の範囲内にあるかどうかを確認する例です。

from datetime import datetime
def is_date_in_range(date_str, start_str, end_str):
    date = datetime.strptime(date_str, '%Y-%m-%d')
    start_date = datetime.strptime(start_str, '%Y-%m-%d')
    end_date = datetime.strptime(end_str, '%Y-%m-%d')
    
    return start_date <= date <= end_date
# テスト
print(is_date_in_range('2023-10-01', '2023-01-01', '2023-12-31'))  # True
print(is_date_in_range('2024-01-01', '2023-01-01', '2023-12-31'))  # False

この例では、datetime.strptimeメソッドを使用して文字列をdatetimeオブジェクトに変換し、指定された範囲内に日付が含まれているかどうかを確認しています。

日付のソート

日付のソートは、リスト内の日付を昇順または降順に並べ替えるために使用されます。

Pythonのdatetimeモジュールを使用すると、簡単に日付のソートを行うことができます。

以下は、リスト内の日付を昇順にソートする例です。

from datetime import datetime
def sort_dates(date_list):
    # 文字列をdatetimeオブジェクトに変換
    date_objects = [datetime.strptime(date, '%Y-%m-%d') for date in date_list]
    # datetimeオブジェクトをソート
    date_objects.sort()
    # datetimeオブジェクトを文字列に戻す
    sorted_dates = [date.strftime('%Y-%m-%d') for date in date_objects]
    return sorted_dates
# テスト
dates = ['2023-10-01', '2022-05-15', '2023-01-01']
sorted_dates = sort_dates(dates)
print(sorted_dates)  # ['2022-05-15', '2023-01-01', '2023-10-01']

この例では、まず日付文字列をdatetimeオブジェクトに変換し、その後sortメソッドを使用してソートしています。

最後に、ソートされたdatetimeオブジェクトを再び文字列に変換してリストとして返しています。

これらの実用例を通じて、datetimeモジュールを使用した日付のバリデーション、範囲チェック、ソートの方法を理解することができました。

これらのテクニックは、日付を扱う多くのアプリケーションで役立つでしょう。

目次から探す