Pythonでプログラムを作っていると、「今の時間を表示したい」「日付の形式を変えたい」「文字で書かれた日付をプログラムで使えるようにしたい」といった場面がよく出てきます。
そんなときに活躍するのが、Pythonの日時フォーマット機能です。これを使えば、日付や時刻を自由自在に操作できるようになります。
この記事では、Pythonで日時を扱うための基本的な方法から、実際のプロジェクトで使える応用テクニックまで、初心者の方にもわかりやすく説明します。
この記事で学べること
- 現在の日時を取得する方法
- 日時を好きな形式で表示する方法(strftime)
- 文字列を日時データに変換する方法(strptime)
- 世界各地の時刻を扱う方法(タイムゾーン)
- 実際の開発で使える応用テクニック
現在の日時を取得してみよう
datetimeモジュールの基本
Pythonで日時を扱うときは、datetime
というモジュールを使います。これは最初から用意されているので、特別なインストールは必要ありません。
現在の日時を取得する
from datetime import datetime
# 今の時刻を取得
now = datetime.now()
print(now)
実行結果の例
2024-06-01 14:25:30.123456
コードの説明
from datetime import datetime
:datetimeモジュールからdatetimeクラスを読み込みますdatetime.now()
:現在の日時を取得します- 結果は「年-月-日 時:分:秒.マイクロ秒」の形式で表示されます
日付だけ、時刻だけを取得する
現在の日時から、日付や時刻の部分だけを取り出すこともできます:
from datetime import datetime, date, time
# 現在の日時
now = datetime.now()
# 日付部分だけを取得
today = now.date()
print(f"今日の日付:{today}")
# 時刻部分だけを取得
current_time = now.time()
print(f"現在の時刻:{current_time}")
# 個別の要素を取得
print(f"年:{now.year}")
print(f"月:{now.month}")
print(f"日:{now.day}")
print(f"時:{now.hour}")
print(f"分:{now.minute}")
print(f"秒:{now.second}")
実行結果の例
今日の日付:2024-06-01
現在の時刻:14:25:30.123456
年:2024
月:6
日:1
時:14
分:25
秒:30
特定の日時を作成する
現在の時刻だけでなく、指定した日時も作成できます:
from datetime import datetime
# 指定した日時を作成
specific_date = datetime(2024, 12, 25, 9, 30, 0)
print(f"クリスマスの朝:{specific_date}")
# 誕生日を作成
birthday = datetime(1990, 5, 15)
print(f"誕生日:{birthday}")
実行結果の例
クリスマスの朝:2024-12-25 09:30:00
誕生日:1990-05-15 00:00:00
datetime.now()
で現在の日時が簡単に取得できます。これが日時操作の出発点になります。
strftimeで日時を好きな形式に変換しよう
strftimeの基本的な使い方
strftime
(ストリングフロムタイム)は、日時データを文字列に変換するための機能です。これを使えば、日時を好きな形式で表示できます。
基本的な書き方
日時データ.strftime("表示したい形式")
簡単な例
from datetime import datetime
now = datetime.now()
# 日本でよく使われる形式
japanese_format = now.strftime("%Y年%m月%d日")
print(japanese_format)
# アメリカでよく使われる形式
american_format = now.strftime("%m/%d/%Y")
print(american_format)
# ファイル名に使いやすい形式
filename_format = now.strftime("%Y%m%d_%H%M%S")
print(filename_format)
実行結果の例
2024年06月01日
06/01/2024
20240601_142530
よく使う書式記号一覧
日時の各部分を表現するために、特別な記号を使います:
年・月・日関連
%Y
:年(4桁)例:2024%y
:年(2桁)例:24%m
:月(2桁、01-12)例:06%B
:月名(英語、フル)例:June%b
:月名(英語、短縮)例:Jun%d
:日(2桁、01-31)例:01
時・分・秒関連
%H
:時(24時間形式、00-23)例:14%I
:時(12時間形式、01-12)例:02%M
:分(00-59)例:25%S
:秒(00-59)例:30%p
:AM/PM(12時間形式で使用)例:PM
曜日関連
%A
:曜日名(英語、フル)例:Saturday%a
:曜日名(英語、短縮)例:Sat%w
:曜日(数字、0=日曜日)例:6
実用的なフォーマット例
実際のプロジェクトでよく使われる形式をご紹介します:
from datetime import datetime
now = datetime.now()
# ログファイル用(詳細な時刻)
log_format = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"ログ用:{log_format}")
# ユーザー向け表示(読みやすい形式)
user_format = now.strftime("%Y年%m月%d日 %H時%M分")
print(f"ユーザー向け:{user_format}")
# バックアップファイル名用
backup_format = now.strftime("backup_%Y%m%d_%H%M%S.sql")
print(f"バックアップファイル:{backup_format}")
# 英語での表示
english_format = now.strftime("%B %d, %Y at %I:%M %p")
print(f"英語表示:{english_format}")
# 曜日付きの表示
weekday_format = now.strftime("%A, %Y年%m月%d日")
print(f"曜日付き:{weekday_format}")
実行結果の例
ログ用:2024-06-01 14:25:30
ユーザー向け:2024年06月01日 14時25分
バックアップファイル:backup_20240601_142530.sql
英語表示:June 01, 2024 at 02:25 PM
曜日付き:Saturday, 2024年06月01日
時刻の計算と表示
日時の計算を行って、結果を表示することもできます:
from datetime import datetime, timedelta
now = datetime.now()
# 1週間後
one_week_later = now + timedelta(weeks=1)
print(f"1週間後:{one_week_later.strftime('%Y年%m月%d日 %A')}")
# 30日前
thirty_days_ago = now - timedelta(days=30)
print(f"30日前:{thirty_days_ago.strftime('%Y年%m月%d日')}")
# 3時間後
three_hours_later = now + timedelta(hours=3)
print(f"3時間後:{three_hours_later.strftime('%H時%M分')}")
実行結果の例
1週間後:2024年06月08日 Saturday
30日前:2024年05月02日
3時間後:17時25分
strftime
を使えば、日時を自由な形式で表示できます。用途に応じて適切な形式を選びましょう。
strptimeで文字列を日時データに変換しよう
strptimeの基本的な使い方
strptime
(ストリングパーズタイム)は、文字列で書かれた日時を、Pythonが計算に使える日時データに変換するための機能です。
基本的な書き方
datetime.strptime("日時の文字列", "文字列の形式")
簡単な例
from datetime import datetime
# 文字列から日時データを作成
date_string = "2024-06-01"
date_object = datetime.strptime(date_string, "%Y-%m-%d")
print(f"変換結果:{date_object}")
print(f"データ型:{type(date_object)}")
# 時刻も含む場合
datetime_string = "2024-06-01 14:25:30"
datetime_object = datetime.strptime(datetime_string, "%Y-%m-%d %H:%M:%S")
print(f"時刻付き:{datetime_object}")
実行結果の例
変換結果:2024-06-01 00:00:00
データ型:<class 'datetime.datetime'>
時刻付き:2024-06-01 14:25:30
様々な形式の文字列を変換する
実際のデータでは、日時がいろいろな形式で書かれていることがあります:
from datetime import datetime
# 日本語形式
japanese_date = "2024年06月01日"
converted1 = datetime.strptime(japanese_date, "%Y年%m月%d日")
print(f"日本語形式:{converted1}")
# アメリカ形式
american_date = "06/01/2024"
converted2 = datetime.strptime(american_date, "%m/%d/%Y")
print(f"アメリカ形式:{converted2}")
# ヨーロッパ形式
european_date = "01.06.2024"
converted3 = datetime.strptime(european_date, "%d.%m.%Y")
print(f"ヨーロッパ形式:{converted3}")
# 12時間形式
twelve_hour = "06/01/2024 2:25 PM"
converted4 = datetime.strptime(twelve_hour, "%m/%d/%Y %I:%M %p")
print(f"12時間形式:{converted4}")
# 英語の月名
english_month = "June 01, 2024"
converted5 = datetime.strptime(english_month, "%B %d, %Y")
print(f"英語月名:{converted5}")
実行結果の例
日本語形式:2024-06-01 00:00:00
アメリカ形式:2024-06-01 00:00:00
ヨーロッパ形式:2024-06-01 00:00:00
12時間形式:2024-06-01 14:25:00
英語月名:2024-06-01 00:00:00
エラー処理と実用的な使い方
文字列の形式が間違っていると、エラーが発生します。安全に処理するためのテクニックをご紹介します:
from datetime import datetime
def safe_parse_date(date_string, format_string):
"""安全に日時文字列を変換する関数"""
try:
return datetime.strptime(date_string, format_string)
except ValueError as e:
print(f"エラー:{date_string} を {format_string} で変換できません")
print(f"詳細:{e}")
return None
# 正しい形式
correct_date = safe_parse_date("2024-06-01", "%Y-%m-%d")
print(f"成功:{correct_date}")
# 間違った形式
wrong_date = safe_parse_date("2024/06/01", "%Y-%m-%d")
print(f"失敗:{wrong_date}")
# 複数の形式を試す関数
def parse_date_multiple_formats(date_string):
"""複数の形式を試して日時を変換する"""
formats = [
"%Y-%m-%d",
"%Y/%m/%d",
"%m/%d/%Y",
"%Y年%m月%d日",
"%B %d, %Y"
]
for fmt in formats:
try:
return datetime.strptime(date_string, fmt)
except ValueError:
continue
print(f"どの形式でも変換できませんでした:{date_string}")
return None
# 様々な形式をテスト
test_dates = [
"2024-06-01",
"2024/06/01",
"06/01/2024",
"2024年06月01日",
"June 01, 2024"
]
for date_str in test_dates:
result = parse_date_multiple_formats(date_str)
print(f"{date_str} → {result}")
CSVファイルやログファイルでの活用例
実際のプロジェクトでは、ファイルから日時データを読み込むことがよくあります:
from datetime import datetime
# ログファイルの例(文字列として仮定)
log_lines = [
"2024-06-01 10:30:15 INFO ユーザーがログインしました",
"2024-06-01 10:31:22 ERROR データベース接続エラー",
"2024-06-01 10:32:45 INFO ユーザーがログアウトしました"
]
def parse_log_line(line):
"""ログ行から日時を抽出して変換する"""
# 最初の19文字が日時部分
date_part = line[:19]
message_part = line[20:]
# 日時を変換
log_datetime = datetime.strptime(date_part, "%Y-%m-%d %H:%M:%S")
return log_datetime, message_part
# ログを解析
for line in log_lines:
log_time, message = parse_log_line(line)
print(f"時刻:{log_time.strftime('%H時%M分%S秒')} メッセージ:{message}")
実行結果の例
時刻:10時30分15秒 メッセージ:INFO ユーザーがログインしました
時刻:10時31分22秒 メッセージ:ERROR データベース接続エラー
時刻:10時32分45秒 メッセージ:INFO ユーザーがログアウトしました
strptime
を使えば、文字列で書かれた日時を計算可能なデータに変換できます。これにより、日時の比較や計算が可能になります。
タイムゾーンを正しく扱おう
タイムゾーンとは?
タイムゾーンとは、地球上の各地域で使われている時刻の基準のことです。日本は「JST(日本標準時)」、イギリスは「GMT(グリニッジ標準時)」、アメリカ東部は「EST(東部標準時)」などがあります。
世界中で使われるシステムを作るときは、タイムゾーンを正しく扱うことがとても重要です。
pytzライブラリを使った基本操作
pytz
は、Pythonでタイムゾーンを扱うための便利なライブラリです。
pytzのインストール
pip install pytz
基本的な使い方
from datetime import datetime
import pytz
# 現在のUTC時刻を取得
utc_now = datetime.now(pytz.UTC)
print(f"UTC時刻:{utc_now}")
# 日本時刻に変換
japan_tz = pytz.timezone("Asia/Tokyo")
japan_time = utc_now.astimezone(japan_tz)
print(f"日本時刻:{japan_time}")
# アメリカ東部時刻に変換
eastern_tz = pytz.timezone("US/Eastern")
eastern_time = utc_now.astimezone(eastern_tz)
print(f"アメリカ東部:{eastern_time}")
# イギリス時刻に変換
uk_tz = pytz.timezone("Europe/London")
uk_time = utc_now.astimezone(uk_tz)
print(f"イギリス時刻:{uk_time}")
実行結果の例
UTC時刻:2024-06-01 05:25:30+00:00
日本時刻:2024-06-01 14:25:30+09:00
アメリカ東部:2024-06-01 01:25:30-04:00
イギリス時刻:2024-06-01 06:25:30+01:00
よく使われるタイムゾーン
世界の主要なタイムゾーンをご紹介します:
import pytz
from datetime import datetime
# よく使われるタイムゾーン
timezones = {
"日本": "Asia/Tokyo",
"韓国": "Asia/Seoul",
"中国": "Asia/Shanghai",
"インド": "Asia/Kolkata",
"イギリス": "Europe/London",
"ドイツ": "Europe/Berlin",
"アメリカ東部": "US/Eastern",
"アメリカ西部": "US/Pacific",
"オーストラリア": "Australia/Sydney"
}
# 現在のUTC時刻
utc_now = datetime.now(pytz.UTC)
print(f"基準時刻(UTC):{utc_now.strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 50)
# 各地域の時刻を表示
for region, tz_name in timezones.items():
tz = pytz.timezone(tz_name)
local_time = utc_now.astimezone(tz)
print(f"{region}:{local_time.strftime('%Y-%m-%d %H:%M:%S %Z')}")
zoneinfo(Python 3.9以降の推奨方法)
Python 3.9以降では、標準ライブラリのzoneinfo
を使うことが推奨されています:
from datetime import datetime
from zoneinfo import ZoneInfo
# 現在の日本時刻を取得
japan_now = datetime.now(ZoneInfo("Asia/Tokyo"))
print(f"日本時刻:{japan_now}")
# 異なるタイムゾーンに変換
utc_time = japan_now.astimezone(ZoneInfo("UTC"))
print(f"UTC時刻:{utc_time}")
ny_time = japan_now.astimezone(ZoneInfo("America/New_York"))
print(f"ニューヨーク:{ny_time}")
実用的なタイムゾーン処理の例
実際の開発でよく使われるパターンをご紹介します:
from datetime import datetime
import pytz
class TimeConverter:
"""タイムゾーン変換を簡単にするクラス"""
def __init__(self):
self.utc = pytz.UTC
self.jst = pytz.timezone("Asia/Tokyo")
self.est = pytz.timezone("US/Eastern")
self.pst = pytz.timezone("US/Pacific")
def to_jst(self, dt):
"""任意の日時を日本時刻に変換"""
if dt.tzinfo is None:
# タイムゾーンが設定されていない場合はUTCとして扱う
dt = self.utc.localize(dt)
return dt.astimezone(self.jst)
def to_utc(self, dt):
"""任意の日時をUTCに変換"""
if dt.tzinfo is None:
# タイムゾーンが設定されていない場合はJSTとして扱う
dt = self.jst.localize(dt)
return dt.astimezone(self.utc)
def format_multiple_zones(self, dt):
"""複数のタイムゾーンで時刻を表示"""
if dt.tzinfo is None:
dt = self.utc.localize(dt)
zones = [
("UTC", self.utc),
("日本", self.jst),
("アメリカ東部", self.est),
("アメリカ西部", self.pst)
]
result = []
for name, tz in zones:
local_time = dt.astimezone(tz)
formatted = local_time.strftime("%Y-%m-%d %H:%M:%S %Z")
result.append(f"{name}: {formatted}")
return "\n".join(result)
# 使用例
converter = TimeConverter()
# 現在時刻を複数のタイムゾーンで表示
now = datetime.now(pytz.UTC)
print("現在時刻を各地域で表示:")
print(converter.format_multiple_zones(now))
print("\n" + "=" * 40 + "\n")
# 日本時刻からUTCに変換
japan_time = datetime(2024, 6, 1, 14, 25, 30)
utc_converted = converter.to_utc(japan_time)
print(f"日本時刻 {japan_time} は")
print(f"UTC時刻では {utc_converted.strftime('%Y-%m-%d %H:%M:%S %Z')} です")
ログ記録でのタイムゾーン活用
システムのログを記録するときの実用例:
from datetime import datetime
import pytz
def log_with_timezone(message, timezone="Asia/Tokyo"):
"""タイムゾーン付きでログを記録する"""
tz = pytz.timezone(timezone)
current_time = datetime.now(tz)
# UTC時刻も併記
utc_time = current_time.astimezone(pytz.UTC)
log_entry = (
f"[{current_time.strftime('%Y-%m-%d %H:%M:%S %Z')}] "
f"(UTC: {utc_time.strftime('%H:%M:%S')}) "
f"{message}"
)
print(log_entry)
return log_entry
# 使用例
log_with_timezone("アプリケーションが開始されました")
log_with_timezone("データベースに接続しました")
log_with_timezone("ユーザーがログインしました")
実行結果の例
[2024-06-01 14:25:30 JST] (UTC: 05:25:30) アプリケーションが開始されました
[2024-06-01 14:25:30 JST] (UTC: 05:25:30) データベースに接続しました
[2024-06-01 14:25:30 JST] (UTC: 05:25:30) ユーザーがログインしました
タイムゾーンを正しく扱うことで、世界中で使われるシステムでも時刻の混乱を防げます。pytz
やzoneinfo
を活用して、国際的なアプリケーションを作りましょう。
実践的な活用テクニック
ファイル名に日時を含める
バックアップファイルやログファイルの名前に日時を含める方法:
from datetime import datetime
def create_backup_filename(base_name):
"""バックアップファイル名を生成する"""
now = datetime.now()
timestamp = now.strftime("%Y%m%d_%H%M%S")
return f"{base_name}_backup_{timestamp}.sql"
def create_log_filename():
"""ログファイル名を生成する"""
today = datetime.now()
date_str = today.strftime("%Y%m%d")
return f"app_log_{date_str}.log"
# 使用例
backup_file = create_backup_filename("user_database")
log_file = create_log_filename()
print(f"バックアップファイル:{backup_file}")
print(f"ログファイル:{log_file}")
日付の計算と比較
日付の差を計算したり、期限をチェックしたりする方法:
from datetime import datetime, timedelta
def calculate_age(birth_date_str):
"""誕生日から年齢を計算する"""
birth_date = datetime.strptime(birth_date_str, "%Y-%m-%d")
today = datetime.now()
age = today.year - birth_date.year
# 今年の誕生日がまだ来ていない場合は1歳引く
if today.month < birth_date.month or \
(today.month == birth_date.month and today.day < birth_date.day):
age -= 1
return age
def days_until_deadline(deadline_str):
"""締切日までの日数を計算する"""
deadline = datetime.strptime(deadline_str, "%Y-%m-%d")
today = datetime.now()
diff = deadline - today
return diff.days
def is_business_day(date_str):
"""平日かどうかを判定する(土日を休日とする)"""
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
# weekday(): 月曜=0, 日曜=6
return date_obj.weekday() < 5
# 使用例
print(f"年齢:{calculate_age('1990-05-15')}歳")
print(f"締切まで:{days_until_deadline('2024-12-31')}日")
print(f"平日判定:{is_business_day('2024-06-01')}")
期間の集計と分析
データ分析でよく使われる期間集計の例:
from datetime import datetime, timedelta
from collections import defaultdict
# サンプルデータ(アクセスログのイメージ)
access_logs = [
"2024-06-01 09:15:30 user_001 login",
"2024-06-01 09:18:45 user_002 login",
"2024-06-01 14:22:10 user_001 logout",
"2024-06-02 08:30:15 user_003 login",
"2024-06-02 10:45:20 user_002 logout",
"2024-06-03 11:12:05 user_001 login"
]
def analyze_daily_access(logs):
"""日別のアクセス数を集計する"""
daily_count = defaultdict(int)
for log in logs:
# ログから日時部分を抽出
date_str = log.split()[0]
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
# 日付をキーとして集計
date_key = date_obj.strftime("%Y-%m-%d")
daily_count[date_key] += 1
return dict(daily_count)
def analyze_hourly_access(logs):
"""時間帯別のアクセス数を集計する"""
hourly_count = defaultdict(int)
for log in logs:
# ログから日時部分を抽出
datetime_str = " ".join(log.split()[:2])
datetime_obj = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S")
# 時間をキーとして集計
hour_key = datetime_obj.hour
hourly_count[hour_key] += 1
return dict(hourly_count)
# 分析実行
daily_stats = analyze_daily_access(access_logs)
hourly_stats = analyze_hourly_access(access_logs)
print("日別アクセス数:")
for date, count in sorted(daily_stats.items()):
print(f" {date}: {count}件")
print("\n時間帯別アクセス数:")
for hour in sorted(hourly_stats.keys()):
print(f" {hour:02d}時台: {hourly_stats[hour]}件")
実行結果の例
日別アクセス数:
2024-06-01: 3件
2024-06-02: 2件
2024-06-03: 1件
時間帯別アクセス数:
08時台: 1件
09時台: 2件
10時台: 1件
11時台: 1件
14時台: 1件
営業日の計算
ビジネスシステムでよく必要になる営業日計算の例:
from datetime import datetime, timedelta
def get_business_days(start_date_str, end_date_str):
"""指定期間の営業日数を計算する(土日を除く)"""
start_date = datetime.strptime(start_date_str, "%Y-%m-%d")
end_date = datetime.strptime(end_date_str, "%Y-%m-%d")
business_days = []
current_date = start_date
while current_date <= end_date:
# 平日(月曜=0から金曜=4)の場合のみ追加
if current_date.weekday() < 5:
business_days.append(current_date.strftime("%Y-%m-%d"))
current_date += timedelta(days=1)
return business_days
def add_business_days(start_date_str, days_to_add):
"""指定日から営業日を加算した日付を取得する"""
current_date = datetime.strptime(start_date_str, "%Y-%m-%d")
added_days = 0
while added_days < days_to_add:
current_date += timedelta(days=1)
# 平日の場合のみカウント
if current_date.weekday() < 5:
added_days += 1
return current_date.strftime("%Y-%m-%d")
def is_deadline_approaching(deadline_str, warning_days=3):
"""締切日が近づいているかチェックする"""
deadline = datetime.strptime(deadline_str, "%Y-%m-%d")
today = datetime.now().date()
# 営業日ベースで警告日数を計算
business_days = get_business_days(
today.strftime("%Y-%m-%d"),
deadline.strftime("%Y-%m-%d")
)
remaining_business_days = len(business_days)
return {
"is_approaching": remaining_business_days <= warning_days,
"remaining_days": remaining_business_days,
"deadline": deadline_str
}
# 使用例
print("営業日計算の例:")
business_days = get_business_days("2024-06-01", "2024-06-15")
print(f"6月1日〜15日の営業日数:{len(business_days)}日")
next_business_day = add_business_days("2024-06-01", 5)
print(f"6月1日から営業日5日後:{next_business_day}")
deadline_check = is_deadline_approaching("2024-06-10")
print(f"締切チェック:{deadline_check}")
データベースとの連携
実際のプロジェクトでよく使われる、データベースとの日時データ連携:
from datetime import datetime, timedelta
import json
# データベースから取得したデータのサンプル(JSON形式)
sample_data = [
{"id": 1, "name": "田中", "created_at": "2024-06-01T09:15:30"},
{"id": 2, "name": "佐藤", "created_at": "2024-06-01T14:22:10"},
{"id": 3, "name": "山田", "created_at": "2024-06-02T08:30:15"}
]
class DataProcessor:
"""データベースの日時データを処理するクラス"""
def __init__(self):
self.datetime_format = "%Y-%m-%dT%H:%M:%S"
def parse_database_datetime(self, datetime_str):
"""データベースの日時文字列を解析する"""
return datetime.strptime(datetime_str, self.datetime_format)
def format_for_display(self, datetime_str):
"""表示用の日時形式に変換する"""
dt = self.parse_database_datetime(datetime_str)
return dt.strftime("%Y年%m月%d日 %H時%M分")
def filter_by_date_range(self, data, start_date_str, end_date_str):
"""指定期間のデータをフィルタリングする"""
start_date = datetime.strptime(start_date_str, "%Y-%m-%d")
end_date = datetime.strptime(end_date_str, "%Y-%m-%d") + timedelta(days=1)
filtered_data = []
for item in data:
created_at = self.parse_database_datetime(item["created_at"])
if start_date <= created_at < end_date:
filtered_data.append(item)
return filtered_data
def get_recent_data(self, data, hours=24):
"""指定時間以内のデータを取得する"""
cutoff_time = datetime.now() - timedelta(hours=hours)
recent_data = []
for item in data:
created_at = self.parse_database_datetime(item["created_at"])
if created_at >= cutoff_time:
recent_data.append(item)
return recent_data
def create_summary_report(self, data):
"""データのサマリーレポートを作成する"""
if not data:
return "データがありません"
# 最新と最古のデータを取得
sorted_data = sorted(data, key=lambda x: x["created_at"])
oldest = self.parse_database_datetime(sorted_data[0]["created_at"])
newest = self.parse_database_datetime(sorted_data[-1]["created_at"])
# 期間を計算
period = newest - oldest
report = f"""
データサマリーレポート
==================
総件数: {len(data)}件
期間: {oldest.strftime('%Y年%m月%d日')} 〜 {newest.strftime('%Y年%m月%d日')}
日数: {period.days + 1}日
平均件数/日: {len(data) / (period.days + 1):.1f}件
詳細データ:
"""
for item in sorted_data:
display_time = self.format_for_display(item["created_at"])
report += f"- {item['name']} ({display_time})\n"
return report
# 使用例
processor = DataProcessor()
print("サンプルデータの処理例:")
print("=" * 40)
# 期間フィルタリング
filtered = processor.filter_by_date_range(sample_data, "2024-06-01", "2024-06-01")
print(f"6月1日のデータ: {len(filtered)}件")
# 表示形式変換
for item in sample_data:
display_time = processor.format_for_display(item["created_at"])
print(f"{item['name']}: {display_time}")
print("\n" + "=" * 40)
# サマリーレポート
report = processor.create_summary_report(sample_data)
print(report)
国際化対応の日時表示
多言語対応のアプリケーションで使える日時表示:
from datetime import datetime
import locale
class InternationalDateFormatter:
"""国際化対応の日時フォーマッター"""
def __init__(self):
self.formats = {
"ja": {
"date": "%Y年%m月%d日",
"time": "%H時%M分",
"datetime": "%Y年%m月%d日 %H時%M分",
"weekday": ["月", "火", "水", "木", "金", "土", "日"]
},
"en": {
"date": "%B %d, %Y",
"time": "%I:%M %p",
"datetime": "%B %d, %Y at %I:%M %p",
"weekday": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
},
"de": {
"date": "%d. %B %Y",
"time": "%H:%M",
"datetime": "%d. %B %Y um %H:%M",
"weekday": ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
}
}
def format_date(self, dt, lang="ja", include_weekday=False):
"""指定言語で日付をフォーマットする"""
if isinstance(dt, str):
dt = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")
fmt = self.formats.get(lang, self.formats["ja"])
if lang == "ja":
formatted = dt.strftime(fmt["date"])
if include_weekday:
weekday = fmt["weekday"][dt.weekday()]
formatted += f"({weekday})"
else:
formatted = dt.strftime(fmt["date"])
if include_weekday:
weekday = fmt["weekday"][dt.weekday()]
formatted = f"{weekday}, {formatted}"
return formatted
def format_datetime(self, dt, lang="ja"):
"""指定言語で日時をフォーマットする"""
if isinstance(dt, str):
dt = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")
fmt = self.formats.get(lang, self.formats["ja"])
return dt.strftime(fmt["datetime"])
def create_multilingual_display(self, dt):
"""多言語で同時表示する"""
if isinstance(dt, str):
dt = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")
display = "多言語表示:\n"
display += f"日本語: {self.format_datetime(dt, 'ja')}\n"
display += f"English: {self.format_datetime(dt, 'en')}\n"
display += f"Deutsch: {self.format_datetime(dt, 'de')}\n"
return display
# 使用例
formatter = InternationalDateFormatter()
sample_datetime = datetime(2024, 6, 1, 14, 25, 30)
print("国際化対応の日時表示:")
print("=" * 40)
print(formatter.create_multilingual_display(sample_datetime))
print("曜日付きの日付表示:")
print(f"日本語: {formatter.format_date(sample_datetime, 'ja', True)}")
print(f"英語: {formatter.format_date(sample_datetime, 'en', True)}")
print(f"ドイツ語: {formatter.format_date(sample_datetime, 'de', True)}")
まとめ
Pythonでの日時フォーマットは、strftime、strptime、そしてタイムゾーン管理の3つが基本となります。
学習のポイント
- strftime:日時データを文字列に変換(表示用)
- strptime:文字列を日時データに変換(計算用)
- タイムゾーン:国際的なシステムでは必須の知識
- 実践活用:ファイル名生成、ログ解析、期間計算など
よく使う場面
- ログファイルの解析と整形
- バックアップファイル名の自動生成
- 締切日の管理と通知システム
- アクセス解析と統計レポート
- 国際化対応のウェブアプリケーション
コメント