Pythonで過去の日付を取得する方法(timedeltaのマイナス活用)
生徒
「Pythonで昨日や一週間前の日付を自動で取得したいです。どうすればいいですか?」
先生
「datetimeモジュールとtimedeltaを使うと簡単に取得できます。timedeltaに負の値を渡すことで過去の日付を得られます。」
生徒
「タイムデルタって何ですか?難しそうです。」
先生
「timedeltaは時間の差を表す道具です。例えば、'3日間'や'2時間'のように時間の長さを扱います。ここではマイナスを使って'過去に戻る'イメージで使います。」
1. 基本の考え方
Pythonで日時を扱うには標準ライブラリのdatetimeを使います。現在の日時を取得してから、timedeltaで日数や秒数を引けば過去の日付が得られます。初心者の方向けに、まずは「今」を基準に考えると分かりやすいです。
2. 基本サンプルコード
from datetime import datetime, timedelta
# 現在の日時を取得
now = datetime.now()
print("現在の日時:", now)
# 1日前(昨日)
yesterday = now + timedelta(days=-1)
print("昨日の日時:", yesterday)
# 7日前(1週間前)
one_week_ago = now + timedelta(days=-7)
print("1週間前の日時:", one_week_ago)
# 30秒前
thirty_seconds_ago = now + timedelta(seconds=-30)
print("30秒前の日時:", thirty_seconds_ago)
(ここに出力結果)
3. 日付だけを扱いたいとき
時間部分は不要で日付だけが欲しい場合はdate()メソッドを使います。datetime.date()とは別物なので注意してください。
from datetime import date, timedelta
today = date.today()
print("今日の日付:", today)
# 10日前の日付
ten_days_ago = today + timedelta(days=-10)
print("10日前の日付:", ten_days_ago)
4. よくある使い方と注意点
- キーワード引数で
days, seconds, minutes, hours, weeksが使えます。 - タイムゾーンを扱うときは
datetime.now()の代わりにdatetime.now(tz=...)を使うか、pytzやzoneinfoを検討してください。 - 負の値を渡すことで過去に戻れます。直感的には「now - timedelta(...)」と同じ動作になりますが、例では「now + timedelta(days=-n)」の形でもOKです。
5. 実用例:ログの古いデータを削除する基準日を作る
例えばログを30日より古いものを削除したいとき、基準日を計算して比較することで自動化できます。
from datetime import datetime, timedelta
now = datetime.now()
threshold = now + timedelta(days=-30) # 30日前
# ログの日付と比較して削除するか判断するイメージ
# if log_date < threshold:
# delete_log(log)
6. よくある質問(FAQ)
Q: 「timedeltaにマイナスは危険じゃないですか?」
A: 危険ではありません。timedeltaは時間の差を表すだけなので、マイナス値も正しく動作します。むしろ過去を表す用途で便利です。
Q: 「夏時間やタイムゾーンで日付がずれることはありますか?」
A: はい。夏時間やタイムゾーンを扱う場合は注意が必要です。時間を厳密に扱うならタイムゾーン対応の日時を使いましょう。
7. まとめではなく補足(用語解説)
datetime:日付と時間を表すデータ型。
date:日付だけを表すデータ型。
timedelta:日付や時間の差を表すオブジェクト。正の値は未来、負の値は過去を表します。