今回はGW期間ということで
まじめなプログラミングの話です

解説動画はこちら

 
自粛要請出されちゃってますんで
家にいてやることないなら
勉強して同僚に差をつけちゃいましょう!!


今回は日付操作のお話です

Pythonでは日付操作を行うのに
datetimeというライブラリがあり
これを用いることで日付のデータを
扱う事ができます

datetimeライブラリの読み込み
from datetime import datetime , timedelta

これで日付のデータを
取り扱う準備が出来ました

まず最初に覚えることとして
日付に関わるデータ型が3つ有ります
・文字列型
・datetime型
・unixtimestamp(整数型)

これを相互に変換していきましょう

datetime型にする

文字列 ⇒ datetime
datetime.strptime(文字列 , 時間フォーマット)
day = datetime.strptime('2021-05-01 15:12:59','%Y-%m-%d %H:%M:%S')

print(day)
2021-05-01 15:12:59

day = datetime.strptime('2021-05-01','%Y-%m-%d')

print(day)
2021-05-01 00:00:00


unix_timestamp ⇒ datetime
datetime.fromtimestamp(UnixTimeStamp値)

day = datetime.fromtimestamp(1619849579)

print(day)
2021-05-01 15:12:59



文字列型にする

datetime ⇒ 文字
datetime型の変数.strftime(時間フォーマット)

date_dt = datetime.now()
st = date_dt.strftime('%Y-%m-%d %H:%M:%S')

print(st)
2021-05-01 16:18:27

unix_timestamp ⇒ 文字
datetime.fromtimestamp(UnixTimeStamp値).strftime(時間フォーマット)
st = datetime.fromtimestamp(1619849579).strftime('%Y-%m-%d %H:%M:%S')

print(st)
2021-05-01 15:12:59


unix_timestamp値にする


datetime ⇒ unix_timestamp
int(datetime型の変数.timestamp())
date_dt = datetime.now()
unix = int(date_dt.timestamp())

print(unix)
1619853623

文字 ⇒ unix_timestamp
int(datetime.strptime(日付文字列,時間フォーマット).timestamp())
unix = int(datetime.strptime('2021-05-01 15:12:59','%Y-%m-%d %H:%M:%S').timestamp())

print(unix)
1619849579

これで色々なデータに変換する事ができます

次は日付の計算です
timedeltaを用いて日付の計算が行えます
まずはdatetime型のデータを用意しましょう
date_dt = datetime.strptime('2021-05-01 15:12:59','%Y-%m-%d %H:%M:%S')

print(date_dt)
2021-05-01 15:12:59


datetime の加算(timedelta)を行う場合は
下記のようなコードで計算できます

datetime +- timedelta(単位=加算する量)

print(date_dt - timedelta(weeks=10))              # 週
print(date_dt - timedelta(days=10))                 # 日
2021-02-20 15:12:59
2021-04-21 15:12:59

print(date_dt - timedelta(hours=10))               # 時間
print(date_dt - timedelta(minutes=10))           # 分
print(date_dt - timedelta(seconds=10))           # 秒
print(date_dt - timedelta(milliseconds=10))    # ミリ秒
print(date_dt - timedelta(microseconds=10)) # マイクロ秒
2021-05-01 05:12:59
2021-05-01 15:02:59
2021-05-01 15:12:49
2021-05-01 15:12:58.990000
2021-05-01 15:12:58.999990

ただし、月や年単位の場合は
relativedeltaを用いるようです
from dateutil.relativedelta import relativedelta

print(date_dt - relativedelta(years=10))            # 年
print(date_dt - relativedelta(months=10))        # 月
2011-05-01 15:12:59
2020-07-01 15:12:59

曜日の判定
weekdayで月曜日を 0,日曜日を 6 として
曜日を整数で返すのでそれをうまく使います

datatime.date(年,月,日).weekday()
datetime型の変数.weekday()

wd = ["月", "火", "水", "木", "金", "土", "日"]

date_dt = datetime.strptime('2021-05-01 15:12:59','%Y-%m-%d %H:%M:%S')

print(date_dt.weekday())
print(wd[date_dt.weekday()])
5



X日分の日付リストを作る

日付のリストを作るとかは
業務で良く出てくるコードです

サンプルを載せておきます
from datetime import datetime , timedelta

X = 4
days , day = [] , datetime.strptime('2018-05-01','%Y-%m-%d')
for i in range(X):
    tmp = day + timedelta(days=i)
    days.append(tmp.strftime('%Y-%m-%d'))
    
print(days)
['2018-05-01', '2018-05-02', '2018-05-03', '2018-05-04']



来月の1日とか月末みたいなものを出す

timedeltaを組み合わせると
1日や月末の日付なども求められます

# 今日
today = datetime.strptime('2021-04-03 15:12:59','%Y-%m-%d %H:%M:%S')
print(today)

# 来月の1日
first_day = (today + relativedelta(months=1)).replace(day=1)
print(first_day.strftime('%Y-%m-%d'))

# 2ヶ月後の月末
last_day = ((today + relativedelta(months=3)).replace(day=1) - timedelta(days=1))

print(last_day.strftime('%Y-%m-%d'))
2021-04-03 15:12:59
2021-05-01
2021-06-30

まあどんな言語でも日付操作はできると思いますが
こんな感じで様々な日付を求める事が
簡単に出来るのもPython言語の
良いところですね

覚えておくと業務が捗る事
間違いないです

なおこういった良く使う系のコードは
こちらにまとめていますので
もし良ければ見てみてください

Pythonチートシート


今回はこれまでです

それでは