「Python タイムスタンプ:初心者のための変換とフォーマットの基本」

「ビューティー&ファッションのエキスパートが解説!初心者向けの美容とファッションの基本ガイド」

ジュニアとシニアの開発者が共通して持つ最も重要なことは何でしょうか?それは、両方ともマニュアルを参照せずに日付を扱う方法を知らないということです。何か理由があって覚えるのが難しいことだけど、もう心配ありません!

Pythonのタイムスタンプは、さまざまなアプリケーションやシステムで重要な役割を果たしており、特定のイベントの正確な日時を記録することで、正確なデータの追跡や意思決定の改善を保証しています。Pythonでは、datetimeモジュールを使用して、タイムスタンプを簡単に生成および操作できます。このモジュールにより、開発者は日付と時刻データを効率的に処理および操作することができます。

Pythonのdatetimeモジュールは、日付、時刻、および時間間隔を扱うための強力な関数を提供しています。このモジュールの重要な要素の一つは、イベントの日付と時刻をマイクロ秒単位まで正確にエンコードしたタイムスタンプを作成する能力です。これらのタイムスタンプは、POSIX標準に従っており、datetimeモジュールのユーティリティを使用して、さまざまな形式に生成、解析、および変換することができます。

この記事では、Pythonでタイムスタンプを生成、変換、比較するためのさまざまな方法について探求します。ディスカッションを通じて、タイムスタンプを完全に理解し、Pythonアプリケーションで効果的に活用するための主要な関数、技法、およびベストプラクティスに触れていきます。

タイムスタンプの理解

タイムスタンプは、現代のプログラミングにおいて重要な要素であり、時系列データや2つのイベント間の経過時間を計測するタスクに特に適しています。このセクションでは、タイムスタンプとは何か、Pythonでの動作方法、およびナイーブなタイムスタンプとアウェアなタイムスタンプの違いについて探求します。

Unixタイムスタンプ

Unixタイムスタンプ(エポック時刻とも呼ばれる)は、1970年1月1日00:00:00 UTC以降の経過秒数を表します。Unixタイムスタンプは、POSIXタイムスタンプ基準に基づいて時間を表すための標準化された手法として広く使用されています。Unixタイムスタンプを使用する利点のいくつかは次のとおりです:

  • 携帯性:さまざまなオペレーティングシステムやプログラミング言語で動作します。
  • 比較の容易さ:秒単位のタイムスタンプを比較することで、期間や時間間隔を簡単に計算できます。
  • コンパクトな表現:複雑な日付時刻オブジェクトよりも整数を保存、送信、操作する方が容易です。

Python datetimeオブジェクト

Pythonでは、datetimeモジュールが日付と時刻を簡単に扱うためのクラスを提供しています。最も一般的に使用されるクラスは次のとおりです:

  • date:グレゴリオ暦での日付(年、月、日)を表します。
  • time:24時間形式の時間(時、分、秒、マイクロ秒)を表します。
  • datetime:日付と時間の両方の特徴を1つのオブジェクトに結合します。

タイムスタンプを扱うためには、datetimeクラスのfromtimestamp()timestamp()などのメソッドを使用して、Unixタイムスタンプをdatetimeオブジェクトに変換したり、その逆を行ったりすることができます。

今日必要なライブラリのインポートは次のとおりですので、スクリプト/ノートブックの先頭に追加してください:

import pytzfrom datetime import datetime, date, time, timedelta, timezone

では、最初の例に進みましょう。次のコードスニペットは、UnixタイムスタンプをPythonのdatetimeオブジェクトに変換します:

# Unixタイムスタンプをdatetimeオブジェクトに変換するunix_timestamp = 1687392000dt_object = datetime.fromtimestamp(unix_timestamp)print(dt_object)

以下は出力です:

Image 1 - Unix timestamp to datetime (Image by author)

Image 1 – Unix timestamp to datetime (Image by author)

PythonのdatetimeオブジェクトをUnixタイムスタンプに変換することもできます:

# datetimeオブジェクトをUnixタイムスタンプに変換するcurrent_time = datetime.now()unix_timestamp = current_time.timestamp()print(unix_timestamp)

これが表示されます:

Image 2 - Datetime to Unix timestamp (Image by author)

イメージ2 – DatetimeからUnixタイムスタンプへ(作成者による画像)

ナイーブとアウェアのタイムスタンプ

Pythonのdatetimeモジュールは、2つのタイプのタイムスタンプを区別します:ナイーブとアウェア。

  • ナイーブのタイムスタンプは、いかなるタイムゾーン情報も含まれていないため、夏時間やその他の調整を考慮せずにローカル時間のみを記録します。その結果、ナイーブなタイムスタンプはあいまいであり、記録された時間の特定の場所や文脈を示しません。
  • アウェアのタイムスタンプは、オブジェクトの一部としてタイムゾーンを含み、特定の場所での実際の時間のより正確な表現を提供します。タイムゾーンを追加することにより、常に時間の計測における文脈の変更を考慮した正確な時間の操作が可能となります。

まず、ナイーブなdatetimeオブジェクトを作成しましょう:

# ナイーブなdatetimeオブジェクトnaive_dt = datetime.now()print(naive_dt)

これが表示されます:

Image 3 - Datetime object (Image by author)

イメージ3 – Datetimeオブジェクト(作成者による画像)

次に、以下のコードを実行して、タイムゾーンを考慮したアウェアなdatetimeオブジェクトに変換します:

# datetimeオブジェクトをUTCタイムゾーンを考慮したアウェアな状態にするaware_dt = naive_dt.replace(tzinfo=timezone.utc)print(aware_dt)

これが出力です:

Image 4 - タイムゾーンを考慮したdatetimeオブジェクト(作成者による画像)

イメージ4 – タイムゾーンを考慮したdatetimeオブジェクト(作成者による画像)

同様に、以下のようにpytzモジュールを利用して、datetimeオブジェクトを特定のタイムゾーンに変換することもできます:

# ナイーブなdatetimeを特定のタイムゾーン(例:US/Eastern)に変換するeastern_tz = pytz.timezone("US/Eastern")aware_dt = naive_dt.astimezone(eastern_tz)print(aware_dt)

以下が結果です:

Image 5 - 特定のタイムゾーンのdatetimeオブジェクト(作成者による画像)

イメージ5 – 特定のタイムゾーンのdatetimeオブジェクト(作成者による画像)

PythonにおけるUnixタイムスタンプ、datetimeオブジェクト、ナイーブなタイムスタンプとアウェアなタイムスタンプの違いを理解することにより、プログラミングタスクでの日付と時間の操作をより効果的に管理できます。

Python Datetimeモジュール – 詳細ガイド

Pythonで日付と時間を扱うためには、datetimeモジュールを利用します。すでにインポートされているため、する必要のあるタスクが1つ減ります。

基本的なDatetime関数

datetimeモジュールは、datetimedatetime、およびtimedeltaなどのいくつかのクラスを提供しています。これらのクラスは、日付、時間、および間隔を表現および操作するために使用されます。

datetime.date

これはグレゴリオ暦の日付(年、月、日)を表します。date(year, month, day)コンストラクタを使用して日付オブジェクトを作成することができます。現在の日付を取得するには、date.today()関数を使用できます:

today = date.today()print(f"今日の日付:{today}")

これが表示される内容です:

イメージ6 - 今日の日付(著者のイメージ)

イメージ6 – 今日の日付(著者のイメージ)

datetime.time

これは、時、分、秒、マイクロ秒の要素を保持する時間を表します。 time(hour, minute, second, microsecond) コンストラクタを使用して、時間オブジェクトを作成できます:

t = time(13, 45, 30)print(f"時間オブジェクト:{t}")

以下が出力結果です:

イメージ7 - カスタム時間オブジェクト(著者のイメージ)

イメージ7 – カスタム時間オブジェクト(著者のイメージ)

datetime.datetime

これは、日付と時間の組み合わせを表します。 date クラスおよび time クラスの属性をすべて持っています。 datetime(year, month, day, hour, minute, second, microsecond) コンストラクタを使用して、datetimeオブジェクトを作成できます:

dt = datetime(2023, 6, 21, 17, 35, 22)print(f"Datetimeオブジェクト:{dt}")

以下が結果です:

イメージ8 - カスタムdatetimeオブジェクト(著者のイメージ)

イメージ8 – カスタムdatetimeオブジェクト(著者のイメージ)

datetime.timedelta

これは、2つの日付または時間の間の期間を表します。 timedelta オブジェクトを使用して、日付や時間を操作するために算術演算を実行できます:

delta = timedelta(days=7)next_week = today + deltaprint(f"来週の日付:{next_week}")

コンソールに表示される内容は次のとおりです:

イメージ9 - PythonのTimedelta(著者のイメージ)

イメージ9 – PythonのTimedelta(著者のイメージ)

Pythonにおける日付時刻の書式設定

strftime() 関数を使用すると、特定の書式設定で datetime オブジェクトを文字列に変換できます。日付や時間のコンポーネントを表すためにフォーマットコードを使用できます。よく使用されるフォーマットコードのいくつかは次のとおりです:

  • %Y – 世紀付きの年
  • %y – 世紀なしの年
  • %m – ゼロパディングされた10進数の月
  • %d – ゼロパディングされた10進数の日
  • %H – ゼロパディングされた10進数の時(24時間制)
  • %M – ゼロパディングされた10進数の分
  • %S – ゼロパディングされた10進数の秒

strftime() を使用して datetime オブジェクトの書式設定の例を次に示します:

dt = datetime(2023, 6, 21, 17, 35, 22)formatted_dt = dt.strftime("%Y-%m-%d %H:%M:%S")print(f"書式設定された日時:{formatted_dt}")

これが出力結果です:

画像10 - 日付時刻を文字列に変換する(著者による画像)

画像10 – 日付時刻を文字列に変換する(著者による画像)

Pythonのdatetimeモジュールと一緒に作業することで、アプリケーションで日付と時刻を簡単に扱うことができます。このモジュールには、日付と時刻のデータを扱うためのさまざまなクラスと関数が用意されており、開発者にとって強力なツールとなっています。

Pythonでのタイムスタンプの変換

このセクションでは、PythonでdatetimeオブジェクトとUNIXタイムスタンプを変換する方法について説明します。これは、時間データを扱う際に重要なステップであり、時間ベースの情報を効率的に操作や比較することができます。

DatetimeからUNIXタイムスタンプへの変換

.timestamp()メソッドを使用することで、datetimeオブジェクトをUNIXタイムスタンプに簡単に変換できます。まず、datetimeオブジェクトを作成する必要があります。datetime.now()関数を使用して、datetimeオブジェクトを作成し、次に.timestamp()メソッドを使用してdatetimeオブジェクトをUNIXタイムスタンプに変換します:

current_datetime = datetime.now()
unix_timestamp = current_datetime.timestamp()
print(unix_timestamp)

これにより、下の画像から見るように、UNIXタイムスタンプが浮動小数点数として返されます。これは、1970年1月1日(UNIXエポック)からの秒数を表しています:

画像11 - UNIXタイムスタンプ(著者による画像)

画像11 – UNIXタイムスタンプ(著者による画像)

UnixタイムスタンプからDatetimeへの変換

Unixタイムスタンプをdatetimeオブジェクトに変換するには、fromtimestamp()メソッドを使用します。Unixタイムスタンプunix_timestampがあると仮定します。以下のように、datetimeオブジェクトに変換できます:

converted_datetime = datetime.fromtimestamp(unix_timestamp)
print(converted_datetime)

この操作によって得られるconverted_datetimeは、対応する日付と時刻情報を持つdatetimeオブジェクトになります:

画像12 - Unixタイムスタンプからdatetimeへ(著者による画像)

画像12 – Unixタイムスタンプからdatetimeへ(著者による画像)

まとめると、datetimeオブジェクトとUNIXタイムスタンプの変換は、Pythonの組み込みdatetimeモジュールを使用することで簡単に行うことができます。これらの2つの形式を簡単に切り替えるための.timestamp()およびdatetime.fromtimestamp()メソッドを利用することで、効率的な時間ベースのデータの操作や比較が可能となります。

Pythonでのタイムゾーンの操作

Pythonでのタイムゾーンの操作は、datetimeモジュールのtzinfoクラスを使用して行うことができます。このクラスは、タイムゾーン情報の抽象基底クラスを提供し、timezoneクラスと一緒に使用して、タイムゾーン対応のdatetimeオブジェクトを操作します。timezoneクラスはtzinfoのサブクラスであり、UTC(協定世界時)からの固定オフセットを表します

TzinfoとTimezoneクラス

特定のオフセットを持つタイムゾーンオブジェクトを作成するには、次のようにします:

offset = timedelta(hours=2)
timezone_obj = timezone(offset)
print(timezone_obj)

以下が出力されます:

画像13 - タイムゾーンオブジェクト(著者による画像)

イメージ13 – タイムゾーンオブジェクト(画像 by 作者)

UTCとタイムゾーンの変換

日付と時刻の操作では、異なるタイムゾーンとそれらとUTCの関係を意識することが重要です。`datetime`モジュールを使用して、タイムゾーンを認識した`datetime`オブジェクトを作成し、UTCとローカル時間の変換を行うことができます。以下のコードを使用して、現在のUTC時刻を取得できます。

current_utc = datetime.utcnow()print(current_utc)

以下は出力結果です。

イメージ14 - 現在のUTC時刻(画像 by 作者)

イメージ14 – 現在のUTC時刻(画像 by 作者)

ナイーブな(タイムゾーン情報を持たない)`datetime`オブジェクトをタイムゾーンを認識したオブジェクトに変換するには、`replace()`メソッドと`timezone`オブジェクトを使用します。

naive_dt = datetime.now()aware_datetime = naive_dt.replace(tzinfo=timezone_obj)print(aware_datetime)

以下は結果です。

イメージ15 - タイムゾーンを認識した時刻(画像 by 作者)

イメージ15 – タイムゾーンを認識した時刻(画像 by 作者)

ローカル時間とUTCオフセット

指定されたタイムゾーンを持つタイムゾーンを認識した`datetime`オブジェクトからローカル時刻を取得するには、`astimezone()`メソッドを使用します。

local_datetime = aware_datetime.astimezone(timezone_obj)print(local_datetime)

以下は表示結果です。

イメージ16 - ローカルの日時(画像 by 作者)

イメージ16 – ローカルの日時(画像 by 作者)

特定のタイムゾーンのUTCオフセットを秒単位で取得するには、与えられた`datetime`オブジェクトと`timezon`オブジェクトの`utcoffset()`メソッドを使用します。

dt = datetime(2023, 6, 21, 17, 35, 22)utc_offset = timezone_obj.utcoffset(dt)offset_in_seconds = utc_offset.total_seconds()print(offset_in_seconds)

以下は結果です。

イメージ17 - タイムゾーンオフセット(画像 by 作者)

イメージ17 – タイムゾーンオフセット(画像 by 作者)

UTCオフセットは夏時間(DST)の調整によって変化する可能性があることに注意してください。

日付と時刻の操作とフォーマット

このセクションでは、Pythonの文字列を`datetime`オブジェクトに解析する方法と、基本的な`datetime`演算の方法を学びます。

文字列を`datetime`に解析する

Pythonの`datetime`モジュールは、日付と時刻を文字列としてフォーマットするために`strftime()`メソッドを提供しています。このメソッドを使用することで、フォーマットコードを使用して出力形式をカスタマイズすることができます。

以下は使用例です。

date_string = "2023-06-21 14:30:59"date_format = "%Y-%m-%d %H:%M:%S"datetime_object = datetime.strptime(date_string, date_format)print(f"Datetime object: {datetime_object}")

以下はコンソールに表示される内容です。

Image 18 - String to datetime (Image by author)

画像18 – 文字列から日時へ(画像:著者)

日時の計算

Pythonのdatetimeモジュールは、日時オブジェクトに対する算術演算もサポートしています。計算を行うためには、期間のためにtimedeltaクラスを使用することができます。

例えば、期間を追加することができます:

now = datetime.now()
one_week = timedelta(weeks=1)
future_date = now + one_week
print(f"将来の日付:{future_date}")

以下は結果です:

Image 19 - Adding datetime objects (Image by author)

画像19 – 日時オブジェクトの追加(画像:著者)

または、日時を減算することもできます:

past_date = now - one_week
print(f"過去の日付:{past_date}")

以下は印刷される結果です:

Image 20 - Subtracting datetime objects (Image by author)

画像20 – 日時オブジェクトの減算(画像:著者)

属性の抽出

日時オブジェクトから特定の属性を抽出するには、以下のプロパティを使用することができます:

  • year:年(整数)、例:2023年
  • month:月(整数)、例:5月
  • day:月の日(整数)、例:21日
  • hour:時(24時間制、整数)、例:14時
  • minute:分(整数)、例:30分
  • second:秒(整数)、例:59秒

属性の抽出の例:

now = datetime.now()
print(f"年:{now.year}")
print(f"月:{now.month}")
print(f"日:{now.day}")
print(f"時:{now.hour}")
print(f"分:{now.minute}")
print(f"秒:{now.second}")

以下は結果です:

Image 21 - Extracting attributes from a datetime object (Image by author)

画像21 – 日時オブジェクトから属性を抽出する(画像:著者)

上記で説明したメソッド、クラス、およびプロパティを利用することで、Pythonで効率的に日付と時刻を操作およびフォーマットすることができます。日付と時刻に関する一般的な操作に対して包括的な機能を提供する、datetimeモジュールが重要なリソースとなります。

Pythonタイムスタンプ – 上級コンセプト

このセクションでは、興味深いいくつかの上級用途について説明します。

閏秒の処理

閏秒は、地球の遅れる回転を考慮するための1秒のたましい調整です。同じ秒内での異なるタイムスタンプにおいて、同じPOSIXタイムスタンプ値が発生することがあります。

Pythonのtimeライブラリは、システムの内部設定に従って閏秒を処理します。ただし、時間の処理で閏秒を追加するための直接的なメソッドはありません。一貫性を確保し、閏秒に関する問題を回避するために、astropy.timeライブラリを使用することができます。

しかし、まずそれをインストールする必要があります:

pip install astropy

そして、使用例に移りましょう:

from astropy.time import Time

t = Time("2023-06-21T00:00:00", scale="utc", format="isot")
t += 1
print(f"1秒後の時間(閏秒を含む):{t.isot}")

以下が出力結果です:

Image 22 - 閏秒(著者による画像)

Image 22 – 閏秒(著者による画像)

このアプローチは、国際原子時(TAI)に基づいて存在する任意の閏秒を考慮しています。

高精度なタイムスタンプの使用

Pythonの組み込みモジュールであるdatetimeパッケージは、通常マイクロ秒までの精度でタイムスタンプを提供します。ただし、より高精度なタイムスタンプ(ナノ秒など)に遭遇することがあります。これらはnumpyライブラリを使用して解析できます:

import numpy as np

timestamp_str = "2023-06-21T08:17:14.078685237Z"
dt = datetime.strptime(timestamp_str[:-9], "%Y-%m-%dT%H:%M:%S.%f")
timestamp = np.datetime64(dt)
print(f"高精度なタイムスタンプを解析しました:{timestamp}")

これにより、高精度なタイムスタンプ(ISO 8601形式)がnumpy.datetime64オブジェクトに変換されます:

Image 23 - numpyにおける高精度なタイムスタンプ(著者による画像)

Image 23 – numpyにおける高精度なタイムスタンプ(著者による画像)

pandas.Timestamp関数を使用して、タイムスタンプを浮動小数点数でナノ秒の精度で表すこともできます:

import pandas as pd

ts = pd.Timestamp(timestamp_str)
print(f"タイムスタンプ(ns単位):{ts.value}")

以下が出力結果です:

Image 24 - pandasにおける高精度なタイムスタンプ(著者による画像)

Image 24 – pandasにおける高精度なタイムスタンプ(著者による画像)

記事は元々こちらで投稿されました。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more