記事の内容
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、または見積もり相談お願い致します。