Python日付の変換と計算の具体的な使い方
日付の変換と計算
日付については、異なる時間単位の変換が必要になる場合があります。文字列形式の日付を受諾して、datetimeオブジェクトに変換します。日付の範囲と曜日を指定する日があります。ここで多く使われているのはPythonが提供するdatetimeモジュールです。
datetimeモジュール
日付と時間の単純な変換
datetimeモジュールでは、timedeltaオブジェクトを作成することにより、時間帯を表すことができます。以下の例を示します
作成したプログラムが文字列形式で表される日付入力を受け付けている場合、このような文字列をdatetimeオブジェクトに変換して計算する必要があります。
datetimeオブジェクト中のstreptime()を使って、下記のコードを実現します。
以下はいくつかの書式コードです。たとえば:
コマンド
意味
%a
現地勤務日の略語
%A
現地勤務日のフルネーム
%b
当地月の略語
%B
当地の月のフルネーム
%H
ゼロを補完してから10進数で表示する時間(24時間制)
%I
ゼロを補完してから10進数で表示する時間(12時間制)
%M
ゼロを補完してから10進数で表す分
%S
ゼロを補完してから10進数で表される秒
日付を英語で読みやすい形式にフォーマットします。
ここで注意したいのは、streptimeの性能が悪いということです。大量の解析が必要であり、すでにフォーマットがわかっている日付文字列を明らかにすると、自分で解析スキームを実現することが考えられます。YYY-M-DDのようなフォーマットを仮定すると、解析関数は下記のコードで実現できます。
月の日付範囲を計算します。
Pythonが提供するカレンダモジュールはカレンダーに関連する関数を提供する。datetimeモジュールに協力して需要を実現できると考えられます。
上のコードの中で、まずスタートを切る。dateは月の初日の日付に対応して計算します。ここではdateオブジェクトのreplace()を使用して、day属性を1に設定します。すなわち、初日を表します。
canodar.monothrange()関数は指定年に戻ります。指定された年の最初の日は何曜日ですか?そして今月の日数です。
月の日数を取得したら、開始日を加えて終了日が得られます。ここで注意したいのは、終了日がこの日付範囲に含まれていないことです。遍歴している時に、条件をfirst_と判断します。day参考資料
ソース David M.Beazley;Brian K.Jones.Python Cookbook,3 rd Edtions.O'Reilly Media.2013. 「8.1.date time-Baic date and time types」.docs.python.org.Retrieved 11 Januar 2020 「8.2.careendar-General carelated functions」.docs.python.org.Retrieved 13 Januar 2020
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
日付については、異なる時間単位の変換が必要になる場合があります。文字列形式の日付を受諾して、datetimeオブジェクトに変換します。日付の範囲と曜日を指定する日があります。ここで多く使われているのはPythonが提供するdatetimeモジュールです。
datetimeモジュール
日付と時間の単純な変換
datetimeモジュールでは、timedeltaオブジェクトを作成することにより、時間帯を表すことができます。以下の例を示します
>>> from datetime import timedelta
>>> a = timedelta(days=2, hours=6)
>>> b = timedelta(hours=4.5)
>>> c = a + b
>>> c
datetime.timedelta(2, 37800)
>>> c.days
2
>>> c.seconds
37800
>>> c.seconds / 3600
10.5
>>> c.total_seconds() / 3600
58.5
指定された日時を表示するには、まずdatetimeオブジェクトを作成してから、標準的な数学演算を使って操作を行います。例は以下の通りです
>>> from datetime import datetime
>>> a = datetime(2020, 1, 15)
>>> print(a + timedelta(days=10))
2020-01-25 00:00:00
>>> b = datetime(2020, 2, 3)
>>> d = b - a
>>> d
datetime.timedelta(19)
>>> d.days
19
>>> now = datetime.today()
>>> print(now)
2020-01-15 10:59:10.230995
>>> print(now + timedelta(minutes=10))
2020-01-15 11:09:10.230995
datetimeの対象となるうるう年の問題は、以下の例があります。
>>> a = datetime(2020, 3, 1)
>>> b = datetime(2020, 2, 28)
>>> a - b
datetime.timedelta(2)
>>> (a - b).days
2
>>> c = datetime(2019, 3, 1)
>>> d = datetime(2019, 2, 28)
>>> c - d
datetime.timedelta(1)
>>> (c - d).days
1
文字列と日付の変換作成したプログラムが文字列形式で表される日付入力を受け付けている場合、このような文字列をdatetimeオブジェクトに変換して計算する必要があります。
datetimeオブジェクト中のstreptime()を使って、下記のコードを実現します。
>>> from datetime import datetime
>>> text = '2020-01-15'
>>> y = datetime.strptime(text, '%Y-%m-%d')
>>> y
datetime.datetime(2020, 1, 15, 0, 0)
>>> z = datetime.now()
>>> z
datetime.datetime(2020, 1, 15, 11, 10, 11, 71792)
>>> diff = z-y
>>> diff
datetime.timedelta(0, 40211, 71792)
上記%Yの意味は、10進数で表される世紀の年で、%mはゼロを補完した後の10進数で表される月で、%dはゼロを補完した後の10進数で月の1日を表します。以下はいくつかの書式コードです。たとえば:
コマンド
意味
%a
現地勤務日の略語
%A
現地勤務日のフルネーム
%b
当地月の略語
%B
当地の月のフルネーム
%H
ゼロを補完してから10進数で表示する時間(24時間制)
%I
ゼロを補完してから10進数で表示する時間(12時間制)
%M
ゼロを補完してから10進数で表す分
%S
ゼロを補完してから10進数で表される秒
日付を英語で読みやすい形式にフォーマットします。
>>> z
datetime.datetime(2020, 1, 15, 11, 10, 11, 71792)
>>> format_z = datetime.strftime(z, "%A %B %d, %Y")
>>> format_z
'Wednesday January 15, 2020'
datetime.streftime()関数は、表示形式文字列で指定された日付を表す文字列を返します。フォーマットコマンドは、上記のコードの「%A%B%d、%Y」のようです。この関数の最初のパラメータはdatetimeオブジェクトです。ここで注意したいのは、streptimeの性能が悪いということです。大量の解析が必要であり、すでにフォーマットがわかっている日付文字列を明らかにすると、自分で解析スキームを実現することが考えられます。YYY-M-DDのようなフォーマットを仮定すると、解析関数は下記のコードで実現できます。
from datetime import datetime
def parse_ymd(s):
year_s, mon_s, day_s = s.split('-')
return datetime(int(year_s), int(mon_s), int(day_s))
両者の達成効果:
In [1]: from datetime import datetime
...: def parse_ymd(s):
...: year_s, mon_s, day_s = s.split('-')
...: return datetime(int(year_s), int(mon_s), int(day_s))
In [2]: text = "2020-01-15"
In [3]: %timeit datetime.strptime(text, '%Y-%m-%d')
7.75 µs ± 31 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [4]: %timeit parse_ymd(text)
1.05 µs ± 3.07 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
パースス_ymd()関数はdatetime.streptime()より7倍も速いです。大量処理を行う設計日であり、フォーマットが固定されている場合は、この案が考えられます。月の日付範囲を計算します。
Pythonが提供するカレンダモジュールはカレンダーに関連する関数を提供する。datetimeモジュールに協力して需要を実現できると考えられます。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
@File: datetime_calendar.py
@Time: 2020/01/15 12:46:58
@Author:
@Contact: [email protected]
'''
# put the import lib here
from datetime import date, timedelta
import calendar
def get_month_range(start_date=None):
'''
Args:
start_date: , None
Returns:
'''
if start_date is None: # start_date ,
start_date = date.today().replace(day=1)
#
_, days_in_month = calendar.monthrange(start_date.year, start_date.month)
#
end_date = start_date + timedelta(days=days_in_month)
#
return (start_date, end_date)
インタラクティブ・インタラクティブ・インタラクタでは、以下のように使用される。
In [1]: from datetime import timedelta
In [2]: from datetime_calendar import get_month_range
In [3]: a_day = timedelta(days=1)
In [4]: first_day, last_day = get_month_range()
In [5]: while first_day < last_day:
...: print(first_day)
...: first_day += a_day
...:
2020-01-01
2020-01-02
2020-01-03
2020-01-04
2020-01-05
2020-01-06
2020-01-07
2020-01-08
...
注意:インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラクティブ・インタラク上のコードの中で、まずスタートを切る。dateは月の初日の日付に対応して計算します。ここではdateオブジェクトのreplace()を使用して、day属性を1に設定します。すなわち、初日を表します。
canodar.monothrange()関数は指定年に戻ります。指定された年の最初の日は何曜日ですか?そして今月の日数です。
月の日数を取得したら、開始日を加えて終了日が得られます。ここで注意したいのは、終了日がこの日付範囲に含まれていないことです。遍歴している時に、条件をfirst_と判断します。day
ソース