Python: タイムスタンプ・datetime型・文字列型の相互変換

Pythonで日時の情報を使う場合、 日時データをどのデータ型で扱うかは次の3つの選択肢があります。

  • datetime型
  • タイムスタンプ(数値型)
  • 文字列型

そして、必要に応じてこれらのデータ型を変換する場合があります。 例えばファイルのタイムスタンプを取得してdatetime型に変換したり、 datetime型を整形して文字列型として変換して表示することもあります。

datetime、タイムスタンプ、文字列

そこでこの記事では、日時を扱える3つのデータ型の相互変換の方法を紹介します。
まずは「datetime・タイムスタンプ」の相互変換、 次に「datetime・文字列」、 最後に「タイムスタンプ・文字列」の順番で説明します。

datetime型 ⇒ タイムスタンプ

datetime型の日時データをタイムスタンプに変換する場合、 datetimeモジュールのdatetimeオブジェクトのtimestamp()メソッドを使います。

import datetime

dt = datetime.datetime.now()

print("-- datetime型 --")
print(dt)
print(type(dt))

# datetime型  → タイムスタンプ
ts = datetime.datetime.timestamp(dt)

print("-- タイムスタンプ --")
print(ts)
print(type(ts))
実行結果
-- datetime型 --
2022-05-27 04:47:50.432135
<class 'datetime.datetime'>

-- タイムスタンプ --
1653594470.432135
<class 'float'>
1653594470.432135

タイムスタンプ ⇒ datetime型

タイムスタンプをdatetime型に変換する場合、 datetimeオブジェクトのfromtimestamp()メソッドを利用します。

import datetime

# タイムスタンプ
ts = 1653594470

print("-- タイムスタンプ --")
print(ts)
print(type(ts))

# タイムスタンプ  → datetime型
dt = datetime.datetime.fromtimestamp(ts)

print("-- datetime型 --")
print(dt)
print(type(dt))
-- タイムスタンプ --
1653594470
<class 'int'>

-- datetime型 --
2022-05-27 04:47:50
<class 'datetime.datetime'>

datetime型 ⇒ 文字列型

datetime型を文字列型に変換する場合、 strftime()メソッドを使います。
strftime()はインスタンスメソッドなので、 下のサンプルコードのように 「dt.strftime("日時書式")」と記述します。

「%Y,%m,%d」などの日時書式の詳細については以下のPython ドキュメントで確認できます。

strftime() と strptime() の書式コード- Python ドキュメント

import datetime

dt = datetime.datetime.now()

print("-- datetime型 --")
print(dt)
print(type(dt))

# datetime型  → 文字列型
s = dt.strftime("%Y-%m-%d %H:%M:%S")

print("-- 文字列型 --")
print(s)
print(type(s))
実行結果
-- datetime型 --
2022-05-27 05:16:29.457426
<class 'datetime.datetime'>

-- 文字列型 --
2022-05-27 05:16:29
<class 'str'>

文字列型 ⇒ datetime型

文字列型をdatetime型に変換するにはstrptime()メソッドを使います。 strptimeは2つの引数が必要で、第1引数が日時の文字列データ、 第2引数が書式です。

書式
strptime(str_date, format)

サンプルコードは次の通りです。

import datetime

s = "2022-05-27 10:11:23"

print("-- 文字列型 --")
print(s)
print(type(s))

# 文字列型  → datetime型
dt = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")

print("-- datetime型 --")
print(dt)
print(type(dt))
実行結果
-- 文字列型 --
2022-05-27 10:11:23
<class 'str'>

-- datetime型 --
2022-05-27 10:11:23
<class 'datetime.datetime'>

タイムスタンプ ⇒ 文字列型

タイムスタンプから直接文字列に変換する方法はないので、 間にdatetime型を挟んで 「タイムスタンプ ⇒ datetime型 ⇒ 文字列型」と変換します。

datetime、タイムスタンプ、文字列
import datetime

# タイムスタンプ
ts = 1653615922

print("-- タイムスタンプ --")
print(ts)
print(type(ts))

# タイムスタンプ  → datetime
dt = datetime.datetime.fromtimestamp(ts)

# datetime  → 文字列型
s = dt.strftime("%Y-%m-%d %H:%M:%S")

print("-- 文字列型 --")
print(s)
print(type(s))
実行結果
-- タイムスタンプ --
1653615922
<class 'int'>

-- 文字列型 --
2022-05-27 10:45:22
<class 'str'>

文字列型 ⇒ タイムスタンプ

文字列型からタイムスタンプへも直接変換する方法はないので、 「文字列 ⇒ datetime型 ⇒ タイムスタンプ」と変換します。

import datetime

# 文字列型
s = "2022-05-27 10:11:23"

print("-- 文字列型 --")
print(s)
print(type(s))

# 文字列型  → datetime型
dt = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")

# datetime  → タイムスタンプ
ts = datetime.datetime.timestamp(dt)

print("-- タイムスタンプ --")
print(ts)
print(type(ts))
実行結果
-- 文字列型 --
2022-05-27 10:11:23
<class 'str'>

-- タイムスタンプ --
1653613883.0
<class 'float'>

まとめ

これまで出てきた4つのメソッドをまとめておきます。

# datetime型  → タイムスタンプ
ts = datetime.datetime.timestamp(dt)

# タイムスタンプ  → datetime型
dt = datetime.datetime.fromtimestamp(ts)

# datetime型  → 文字列型
s = dt.strftime("%Y-%m-%d %H:%M:%S")

# 文字列型  → datetime型
dt = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
Python