Python UNIX時間(エポック秒)とdatetime変換方法【完全版】

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks

UNIX時間(エポック秒)は1970年1月1日0時0分0秒(UTC)からの経過秒数を表す時刻表現です。この記事では、PythonでUNIX時間とdatetimeオブジェクト間の相互変換を詳しく解説します。

UNIX時間の基本概念

UNIX時間は1970年1月1日00:00:00 UTCを基準点(エポック)とした経過秒数です。

import time
from datetime import datetime

# 現在のUNIX時間を取得
unix_time = time.time()
print(f"現在のUNIX時間: {unix_time}")  # 1705315825.123456

# エポック(1970-01-01 00:00:00 UTC)の確認
epoch = datetime(1970, 1, 1)
print(f"エポック: {epoch}")  # 1970-01-01 00:00:00

datetimeからUNIX時間への変換

timestamp()メソッドを使用

from datetime import datetime, timezone

# ローカル時刻からUNIX時間に変換
dt = datetime(2024, 1, 15, 14, 30, 25)
unix_timestamp = dt.timestamp()
print(f"UNIX時間: {unix_timestamp}")  # 1705315825.0

# UTC時刻からUNIX時間に変換
utc_dt = datetime(2024, 1, 15, 5, 30, 25, tzinfo=timezone.utc)
unix_utc = utc_dt.timestamp()
print(f"UTC UNIX時間: {unix_utc}")

time.mktime()を使用

import time
from datetime import datetime

# datetimeオブジェクトからUNIX時間に変換
dt = datetime(2024, 1, 15, 14, 30, 25)
time_tuple = dt.timetuple()
unix_time = time.mktime(time_tuple)
print(f"UNIX時間: {unix_time}")

手動計算による変換

from datetime import datetime, timezone

def datetime_to_unix(dt):
    """datetimeをUNIX時間に変換(手動計算)"""
    epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
    if dt.tzinfo is None:
        dt = dt.replace(tzinfo=timezone.utc)
    
    delta = dt - epoch
    return delta.total_seconds()

# 使用例
dt = datetime(2024, 1, 15, 14, 30, 25, tzinfo=timezone.utc)
unix_time = datetime_to_unix(dt)
print(f"手動計算UNIX時間: {unix_time}")

UNIX時間からdatetimeへの変換

fromtimestamp()メソッドを使用

from datetime import datetime, timezone

# UNIX時間からローカル時刻に変換
unix_time = 1705315825.123456
dt_local = datetime.fromtimestamp(unix_time)
print(f"ローカル時刻: {dt_local}")

# UNIX時間からUTC時刻に変換
dt_utc = datetime.fromtimestamp(unix_time, tz=timezone.utc)
print(f"UTC時刻: {dt_utc}")

utcfromtimestamp()を使用(非推奨)

from datetime import datetime

# Python 3.12以降で非推奨
unix_time = 1705315825
dt = datetime.utcfromtimestamp(unix_time)
print(f"UTC時刻(非推奨): {dt}")

# 推奨される方法
dt_recommended = datetime.fromtimestamp(unix_time, tz=timezone.utc)
print(f"UTC時刻(推奨): {dt_recommended}")

ミリ秒・マイクロ秒の処理

ミリ秒単位のUNIX時間

from datetime import datetime, timezone

# ミリ秒単位のUNIX時間(JavaScriptなど)
unix_ms = 1705315825123
unix_seconds = unix_ms / 1000

dt = datetime.fromtimestamp(unix_seconds, tz=timezone.utc)
print(f"ミリ秒から変換: {dt}")

# datetimeからミリ秒UNIX時間
dt = datetime(2024, 1, 15, 14, 30, 25, 123000, tzinfo=timezone.utc)
unix_ms = int(dt.timestamp() * 1000)
print(f"ミリ秒UNIX時間: {unix_ms}")

マイクロ秒の精度保持

from datetime import datetime, timezone

# マイクロ秒を含むUNIX時間
unix_time = 1705315825.123456
dt = datetime.fromtimestamp(unix_time, tz=timezone.utc)
print(f"マイクロ秒付き: {dt}")
print(f"マイクロ秒: {dt.microsecond}")

# 精度を指定した変換
def unix_to_datetime_precision(unix_time, precision=6):
    """指定した精度でUNIX時間をdatetimeに変換"""
    rounded_time = round(unix_time, precision)
    return datetime.fromtimestamp(rounded_time, tz=timezone.utc)

result = unix_to_datetime_precision(1705315825.123456789, 3)
print(f"3桁精度: {result}")

実用的な応用例

ログファイルのタイムスタンプ処理

import re
from datetime import datetime, timezone

def parse_unix_log(log_line):
    """ログ行からUNIX時間を抽出してdatetimeに変換"""
    unix_pattern = r'\b(\d{10}(?:\.\d+)?)\b'
    
    def replace_unix_time(match):
        unix_time = float(match.group(1))
        dt = datetime.fromtimestamp(unix_time, tz=timezone.utc)
        return dt.strftime('%Y-%m-%d %H:%M:%S UTC')
    
    return re.sub(unix_pattern, replace_unix_time, log_line)

# 使用例
log = "Error occurred at 1705315825.123"
converted = parse_unix_log(log)
print(converted)  # Error occurred at 2024-01-15 05:30:25 UTC

APIレスポンスの時刻変換

import json
from datetime import datetime, timezone

def convert_unix_timestamps(data):
    """辞書内のUNIX時間をdatetimeに変換"""
    if isinstance(data, dict):
        for key, value in data.items():
            if key.endswith('_at') or key.endswith('_time'):
                if isinstance(value, (int, float)):
                    data[key] = datetime.fromtimestamp(value, tz=timezone.utc)
            elif isinstance(value, (dict, list)):
                convert_unix_timestamps(value)
    elif isinstance(data, list):
        for item in data:
            convert_unix_timestamps(item)

# 使用例
api_data = {
    'id': 1,
    'created_at': 1705315825,
    'updated_at': 1705315900.123,
    'user': {
        'last_login_time': 1705315800
    }
}

convert_unix_timestamps(api_data)
print(api_data['created_at'])  # datetime object

時刻範囲の指定

from datetime import datetime, timezone, timedelta

def get_unix_time_range(days_ago=7):
    """指定日数前からの時刻範囲をUNIX時間で取得"""
    now = datetime.now(timezone.utc)
    start_time = now - timedelta(days=days_ago)
    
    return {
        'start_unix': int(start_time.timestamp()),
        'end_unix': int(now.timestamp()),
        'start_datetime': start_time,
        'end_datetime': now
    }

# 過去1週間の範囲
range_data = get_unix_time_range(7)
print(f"開始: {range_data['start_unix']}")
print(f"終了: {range_data['end_unix']}")

タイムゾーンの考慮

異なるタイムゾーンでの変換

from datetime import datetime, timezone, timedelta

# 日本標準時(JST)
jst = timezone(timedelta(hours=9))
dt_jst = datetime(2024, 1, 15, 14, 30, 25, tzinfo=jst)
unix_jst = dt_jst.timestamp()

# UTC
dt_utc = datetime(2024, 1, 15, 5, 30, 25, tzinfo=timezone.utc)
unix_utc = dt_utc.timestamp()

print(f"JST UNIX時間: {unix_jst}")
print(f"UTC UNIX時間: {unix_utc}")
print(f"同じ値: {unix_jst == unix_utc}")  # True

ローカルタイムゾーンの自動処理

from datetime import datetime
import time

def safe_unix_to_datetime(unix_time, use_utc=True):
    """安全なUNIX時間変換"""
    try:
        if use_utc:
            return datetime.fromtimestamp(unix_time, tz=timezone.utc)
        else:
            return datetime.fromtimestamp(unix_time)
    except (ValueError, OSError) as e:
        print(f"変換エラー: {unix_time} - {e}")
        return None

# 使用例
valid_time = 1705315825
invalid_time = -1

result1 = safe_unix_to_datetime(valid_time)
result2 = safe_unix_to_datetime(invalid_time)
print(f"有効: {result1}")
print(f"無効: {result2}")

パフォーマンスの比較

import time
from datetime import datetime, timezone

# 変換方法のパフォーマンステスト
unix_times = [1705315825 + i for i in range(100000)]

# fromtimestamp()のテスト
start = time.time()
for unix_time in unix_times:
    dt = datetime.fromtimestamp(unix_time, tz=timezone.utc)
print(f"fromtimestamp: {time.time() - start:.3f}秒")

# timestamp()のテスト
datetimes = [datetime.fromtimestamp(t, tz=timezone.utc) for t in unix_times[:1000]]
start = time.time()
for dt in datetimes:
    unix_time = dt.timestamp()
print(f"timestamp: {time.time() - start:.3f}秒")

まとめ

  • 変換方法
    • datetime → UNIX: timestamp()
    • UNIX → datetime: fromtimestamp()
  • タイムゾーン:UTC指定を推奨
  • 精度:ミリ秒・マイクロ秒の処理に注意
  • エラー処理:無効な値に対する適切なハンドリング
  • 実用例:ログ処理、API変換、時刻範囲指定など

UNIX時間の理解と適切な変換処理により、システム間での時刻データ交換が効率的に行えます。

「らくらくPython塾」が切り開く「呪文コーディング」とは?

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座

フリーランスボード

20万件以上の案件から、副業に最適なリモート・週3〜の案件を一括検索できるプラットフォーム。プロフィール登録でAIスカウトが自動的にマッチング案件を提案。市場統計や単価相場、エージェントの口コミも無料で閲覧可能なため、本業を続けながら効率的に高単価の副業案件を探せます。フリーランスボード

ITプロパートナーズ

週2〜3日から働ける柔軟な案件が業界トップクラスの豊富さを誇るフリーランスエージェント。エンド直契約のため高単価で、週3日稼働でも十分な報酬を得られます。リモートや時間フレキシブルな案件も多数。スタートアップ・ベンチャー中心で、トレンド技術を使った魅力的な案件が揃っています。専属エージェントが案件紹介から契約交渉までサポート。利用企業2,000社以上の実績。ITプロパートナーズ

Midworks 10,000件以上の案件を保有し、週3日〜・フルリモートなど柔軟な働き方に対応。高単価案件が豊富で、報酬保障制度(60%)や保険料負担(50%)など正社員並みの手厚い福利厚生が特徴。通勤交通費(月3万円)、スキルアップ費用(月1万円)の支給に加え、リロクラブ・freeeが無料利用可能。非公開案件80%以上、支払いサイト20日で安心して稼働できます。Midworks