pythonのdatetimeについて

pythonの日付に関連する処理についての備忘録です。

※随時更新

- 日付関数は、datetimeをimportします。

```
import datetime
import calendar
```

#1. 現在日付、現在日時

##(1).現在日付を取得する。

```python:
dt1 = datetime.date.today()
```

##(2).現在日時を取得する。

```python:

dt2 = datetime.datetime.now()
```

#2. 日付、日時の生成

##(3).年月日から、日付を生成する。

```python:
y=2019
m=6
d=9
dt3 = datetime.date(y, m, d)
```

##(4).年月日時分から、日付を生成する。

```python:
dt4 = datetime.datetime(year=2019, month=12, day=30, hour=14, minute=0, second=29)
```

#3. 日時のプロパティ

##(5).datetimeの値を取り出す。

```python:
current_datetime = datetime.datetime.now()
print("(5).datetimeの値を取り出す。 year=%s month=%s day=%s week()=%s" % 
    (current_datetime.year,
     current_datetime.month,
     current_datetime.day,
     current_datetime.weekday(),
     )
)
```

#4. 日時<->文字列の相互変換

##(6).datetimeを文字列に変換する
```python:
dt6= datetime.datetime.now()
strdt6 = dt6.strftime('%Y-%m-%d %H:%M:%S')
```

##(7).dateを文字列に変換する
```python:
dt= datetime.date.today()
strdt = dt.strftime('%Y-%m-%d')
```

##(8).文字列（日付）をdateオブジェクトに変換する。
```python:
tstr = '2012-12-29'
tdate = datetime.datetime.strptime(tstr, '%Y-%m-%d')
odate = datetime.date(tdate.year, tdate.month, tdate.day)
```


##(9).文字列（日時）をdatetimeオブジェクトに変換する。

```python:
tstrdt = '2017-12-01 23:06:19'
tdatetime = datetime.datetime.strptime(tstrdt, '%Y-%m-%d %H:%M:%S')
```

#5. 月初、月末の取得

##(10).月初を取得する。

```python:
"""
月初を取得する
"""
def get_firstdate(y, m):
    return datetime.date(y, m, 1)

fdate = get_firstdate(2019, 6)
```

##(11).月末を取得する

```python:
"""
月末を取得する
"""
def get_lastdate(y, m):
    _, days = calendar.monthrange(y, m)
    firstdate = get_firstdate(y, m)
    lastdate = firstdate + datetime.timedelta(days=days - 1)
    return lastdate

ldate = get_lastdate(2019, 6)
```

#6. 月初日時点の週の日曜日、月末日時点の週の土曜日(カレンダー用)

##(12).月初の週始まり（日曜日）を取得する

```python:
"""
月初の週始まり（日曜日）を取得する
"""
def get_first_sunday(y, m):
    firstdate = get_firstdate(y, m)
    from_date = firstdate - datetime.timedelta(days=firstdate.weekday()+1)
    return from_date

fsunday = get_first_sunday(2019, 6)
```

##(13).月末の週終わり（土曜日）を取得する

```python:
"""
月末の週終わり（土曜日）を取得する
"""
def get_last_saturday(y, m):
    lastdate = get_lastdate(y, m)
    to_date = lastdate + datetime.timedelta(days=lastdate.weekday())
    return to_date

fsaturday = get_last_saturday(2019, 6)
```

#7. 24H以上の時間の取り扱い

##(14).24H以上の時刻をdatetimeに変換する

datetime.datetimeのhourに 24以上の数値を渡すとエラーになります。

```
ValueError: hour must be in 0..23
```

このケースでは、timedeltaを使って分数を計算をして、日付に加算することで対応します。

```python:
"""
24H以上の時刻をdatetimeに変換する
"""
def over24Hdatetime(year, month, day, hour, minute):

    #to minute
    minutes = int(hour)*60 + int(minute)
        
    dt = datetime.datetime(year=year, month=month, day=day)
    dt += datetime.timedelta(minutes=minutes)    

    return dt

dt14 = over24Hdatetime(2019, 6, 9, 49, 19)
```

#8. 日付の減算

##(15).時刻同士の引き算（分数に換算する。）

```python:
"""
時刻同士の引き算（分数に換算する。）
"""
def get_minutes(fromdt, todt):
    #2つのdatetimeの差は、timedeltaオブジェクト
    #timedelta には、days, seconds, microsecondsの３つのプロパティがある。
    return (todt - fromdt).seconds / 60

fromdt = datetime.datetime.strptime('2019-06-09 09:00', '%Y-%m-%d %H:%M')
todt = datetime.datetime.strptime('2019-06-09 17:30', '%Y-%m-%d %H:%M')

minutes = get_minutes(fromdt, todt)
```