プログラムで生活をHACKする

YRen-LaB

Python

python datetime を使用した 日付・日時の計算、文字列との相互変換

投稿日:


記事の内容

pythonで日付、日時の計算、文字列との相互変換のメモ

今日の日付を取得

import datetime

today = datetime.datetime.today()

今の日時を取得

import datetime

now = datetime.datetime.now()

日時から年月日時分秒を取得

import datetime

now = datetime.datetime.now()

year = now.year
year = now.year
month = now.month
day = now.day
hour = now.hour
minute = now.minute
second = now.second

print(now) # 2020-05-13 23:59:40.549551
print(year) # 2020
print(month) # 5
print(day) # 13
print(hour) # 23
print(minute) # 59
print(second) # 40

日時,日付の計算

date,datetimeオブジェクト同士なら計算可能
下記の方法なら特定の日付まであと何日という使い方ができる。

引き算

import datetime

datetime1 = datetime.datetime(2020, 5, 13, 23, 59, 40)
datetime2 = datetime.datetime(2020, 5, 12, 20, 50, 20)

datetime3 = datetime1 - datetime2
print(datetime3) # 1 day, 3:09:20 → 1日と3時間9分20秒の差

因みに以下のようにdatetime1とdatetime2を入れ替えても計算できる

import datetime

datetime1 = datetime.datetime(2020, 5, 13, 23, 59, 40)
datetime2 = datetime.datetime(2020, 5, 12, 20, 50, 20)

datetime3 = datetime2 -datetime1
print(datetime3) # -2 days, 20:50:40

足し算

だが、先と同じオブジェクト同士で足し算をするとエラーになる
調べた感じ仕様っぽい?

import datetime

datetime1 = datetime.datetime(2020, 5, 13, 23, 59, 40)
datetime2 = datetime.datetime(2020, 5, 12, 20, 50, 20)

datetime3 = datetime2 + datetime1
# TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'datetime.datetime'

んじゃどうやって足すのかというと
datetime2.timedelta()を使用する。

timedelta()の引数は「week,days,hours,minutes,seconds」のみで年、月を計算することができない。
(日付を足すことで増やしていくことは可能。)
年、月の加算をしたい場合別途「python-dateutil」をinstallする必要がある。

import datetime

datetime1 = datetime.datetime(2020, 5, 13, 23, 59, 40)

# 1週 加算
datetime2 = datetime1 + datetime.timedelta(weeks=1)
print(datetime2) # 2020-05-20 23:59:40

# 5時間 加算
datetime2 = datetime1 + datetime.timedelta(hours=5)
print(datetime2) # 2020-05-14 04:59:40

# 5秒 加算
datetime2 = datetime1 + datetime.timedelta(seconds=5)
print(datetime2) # 2020-05-13 23:59:45

# ※減算も可能
# 5日 減算
datetime2 = datetime1 - datetime.timedelta(days=5)
print(datetime2) # 2020-05-08 23:59:40

# 5分 減算
datetime2 = datetime1 - datetime.timedelta(minutes=5)
print(datetime2) # 2020-05-13 23:54:40

datetime ⇔ 文字列の変換

datetimeから文字列へ変換

datetime,date型から文字列への変換は「strftime()」を使用する
引数にフォーマットを指定することで任意のフォーマットで出力可能

import datetime

datetime1 = datetime.datetime(2020, 5, 13, 23, 59, 40)

datetime2 = datetime1.strftime('%Y-%m-%d %H:%M:%S')
print(datetime2) # 2020-05-13 23:59:40

datetime2 = datetime1.strftime('%Y/%m/%d %H:%M:%S')
print(datetime2) # 2020/05/13 23:59:40

datetime2 = datetime1.strftime('%A, %B %d, %Y')
print(datetime2) # Wednesday, May 13, 2020

記事記載時点で以下のようにフォーマットを指定するとUnicodeErrorがでる。
「年」という文字列が原因の様子。
参考:stack overflow windows上のpythonのdatetime-strftimeで日本語を使うとエラーになる

import datetime

datetime2 = datetime1.strftime('%Y年 %m月 %d日 %H時%M分%S秒')
# UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' in position 2: encoding error

解決方法は以下。
調べるとlocaleを設定する方法もあったが私の場合は解決しなかった。

import datetime

datetime2 = datetime1.strftime('%Y{0}%m{1}%d{2} %H{3}%H{4}%H{5}').format(*'年月日時分秒')
print(datetime2) # 2020年05月13日 23時23分23秒

文字列からdatetimeへ変換

文字列からdatetime型へ変換するには
「strptime()」を使用する。
引数には、変換する文字列と文字列と同じフォーマットを指定する。
異なるフォーマットを引数と渡すか、フォーマットの個数が合っていないとエラーになる。

datetime1 = datetime.datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
print(datetime1) # 2020-05-13 23:59:40 <class 'datetime.datetime'>

datetime1 = datetime.datetime.strptime(datetime_str, '%Y-%m-%d')
# ValueError: unconverted data remains:  23:59:40
# 時分秒のフォーマットがないためエラー

datetime1 = datetime.datetime.strptime(datetime_str, '%Y/%m/%d %H:%M:%S')
# ValueError: time data '2020-05-13 23:59:40' does not match format '%Y/%m/%d %H:%M:%S'
# 年月日のフォーマットが文字列に合っていないのでエラー

まとめ

pythonの日付はdatetime,date型なら計算可能
datetime型⇔文字列への変換はフォーマットに注意。

strftime()の「年」がUnicodeErrorになるのは早く直して。





単純作業にお悩みではありませんか?

何百とあるワードを検索してファイルにまとめたり 数ある商品情報から条件にあるものだけ目で探してリ...

その単純作業プログラムで解決できるかもしれません。 もしよろしければ単純作業からの解放をお手伝いさせてください。

詳しくは以下のページからDM、または見積もり相談お願い致します。

お仕事依頼 ・ 見積もり依頼

adsense




-Python
-, ,

Copyright© YRen-LaB , 2024 AllRights Reserved Powered by AFFINGER4.