[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 |
参考
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 件のコメント:
コメントを投稿