2018/12/04

[Python] date と datetime オブジェクトの相互変換まとめ

datetime オブジェクト、Unix time、文字列の相互変換まとめ を書いたので、ついでと言っては何ですが date と datetime の変換についてもまとめてみました。

なお、掲載コードは以下のように import 済みとします。

1
2
from datetime import datetime, date, time
import pytz

1. date と datetime の相互変換

datetime → date

datetime から date に変換するには dateteime.date() を使用します。

1
2
3
4
5
dt_native = datetime.utcfromtimestamp(1541030400# native
# 2018-11-01 00:00:00
 
dt_native.date()
# 2018-11-01

aware な datetime オブジェクトにも使用できます。当然、タイムゾーンの影響は受けます。

1
2
3
4
5
dt = datetime.fromtimestamp(1541030400, tz=pytz.timezone('America/New_York'))  # aware
# 2018-10-31 20:00:00-04:00
 
dt_aware.date()
# 2018-10-31

date → datetime

date から datetime に変換するには datetime.combine() を使用します。

しかし、combine() にタイムゾーンを指定して aware なオブジェクトを作成するのは危険です。

一度、native に変換してから aware にした方が良いでしょう。

1
2
3
4
5
6
7
8
d = date(2018, 11, 1)
dt_native = datetime.combine(d, time())
print(pytz.timezone('Asia/Tokyo').localize(dt_native))
# 2018-11-01 00:00:00+09:00
 
# tzinfo を指定すると +9:19 になってしまう
datetime.combine(d, time(), tzinfo=pytz.timezone('Asia/Tokyo'))
# 2018-11-01 00:00:00+09:19

参考

[Python] datetime.combine() でタイムゾーンは指定しない方がよい | 穀風

2. date と文字列の変換

date → 文字列

date から文字列に変換するには date.strftime() を使用します。

1
2
3
d = date(2018, 11, 1)
d.strftime("%Y/%m/%d")
# 2018/11/01

文字列 → date

date オブジェクトには datetime.strptime() 相当のメソッドが用意されていません。 そのため、一度 datetime を経由してから、date に変換するしかなさそうです。

1
2
3
4
date_string = "2018/11/01"
dt = datetime.strptime(date_string, "%Y/%m/%d")
dt.date()
# 2018-11-01

3. ISO フォーマット文字列と date の相互変換

ISO 8601 形式 と date の相互変換も提供されています。

ISO フォーマット文字列 → date

ISOフォーマット文字列から date オブジェクトの変換は date.fromisoformat() を使用します。

"YYY-MM-DD" のみ対応。 Python 3.7 で導入されました。

1
2
date.fromisoformat("2018-11-01")
# 2018-11-01

date → ISO フォーマット文字列

1
2
3
d = date(2018, 11, 1)
d.isoformat()
# 2018-11-01

4. Unix time から date への変換

Unix time から date オブジェクトの変換には date.fromtimestamp() が使えます。

ただ、ローカルタイムゾーンを適用して変換されてしまうのでなるべく使わない方が良いでしょう。

1
2
3
date.fromtimestamp(1541030400)
# 2018-11-01  (+09:00 のタイムゾーン設定されているマシンで実行した場合)
# 2018-10-31  (-05:00 のタイムゾーン設定されているマシンで実行した場合)

例外的に、 datetime.now() 等を用いてローカルタイムを処理する場合などは使えると思います。

1
2
3
4
5
now = datetime.now()
# 2018-11-30 10:44:35.469159
 
date.fromtimestamp(now.timestamp())
# 2018-11-30

0 件のコメント: