デロリアン・データタイム・オブジェクトをヒューマナイズする方法

Pythonでdatetimeを扱うのも例外ではなく、datetimeを扱うのは少し大変で挑戦的なことです。

Pythonの組み込みモジュールである datetime は、 date, datetime, time, timezone, timedelta といったいくつかのクラスを導入し、Arrowなどの公式モジュールが抱える問題を解決するためにいくつかの外部ライブラリが生まれました。

このガイドでは、Deloreanでdatetimeオブジェクトを人間らしくする方法を見ていきます。

このライブラリは、タイムゾーンに関する問題を解決するための標準ライブラリであるpytzと、任意の2つのdatetimeオブジェクト間の差分を計算するためのdateutilをベースに構築されたライブラリです。

Deloreanのインストール 仮想環境の構築

Deloreanは、pip経由でインストールすることができます。

一般に、仮想環境で作業することが推奨されます。

なぜなら、異なるプロジェクトで必要とされる依存関係を分離して整理することができるからです。

LinuxやMacOSで仮想環境を構築するには、以下のようにします。

$ python3 -m venv env
$ source env/bin/activate
$ python3 -m pip install delorean


または、Windowsでは、次のように実行します。

$ virtualenv env
$ .envScriptsctivate
$ python3 -m pip install delorean


humanize()によるDelorean Datetimeオブジェクトのヒューマナイズ

エポックタイム・スタンプは非常に正確で、デジタル機器には最適ですが、人間にはあまり理解しやすいものではありません。

私たちは、このようなスケールに対する認知的な認識を持っていません。

さらに、私たちは、より稀な場面を除いて、多くの場合、実際には日付で考えることすらありません。

据え置き型からモバイル型まで、ほとんどのデジタル機器に時計とカレンダーが組み込まれていなければ、ほとんどの人は今日が何の日なのか知らなかったかもしれません。

ほとんどの場合、私たちは今いる場所を基準にして時間を扱ってきました。

あなたの友人に会ったのはいつですか?2021年の7月12日ですか、それとも昨日ですか?ヒューマナイズ()`関数は、事実上の日付を受け取り、それを人々がイベントの時間を伝えるときに使うような表現に変えます。

import  delorean
datetime_strings = ["Thu July 12 2021", "June 5th, 2021", "April 28th, 2052"]


for date in datetime_strings:
    delorean_object = delorean.parse(date)
    human_date = delorean_object.humanize()
    print(human_date)


これらの日付文字列はDeloreanオブジェクトにパースされ、その後ヒューマナイズされます。

4 hours from now
a month ago
30 years from now


この機能は、アプリケーション上でイベントの前や後の時間を示すアノテーションとして非常に有効です。

例えば、1日前に通知が来たことや、1ヶ月後にコンサートがあることをユーザーに伝えることができます。

これは、例えばN日以上前のイベントであれば、切り替えて表示することも可能です。

これを行うには、timedeltaを使用して、現在の日付よりN日以上前に発生した日付かどうかを測定し、メッセージを適切に調整することになります。

import delorean
# Dates denote events, such as notifications.
# First event occured recently before writing this guide.
# The second event occured a bit over a month before that.
datetime_strings = ["Thu July 12 2021", "June 5th, 2021"]


for index, date in enumerate(datetime_strings):
    delorean_object = delorean.parse(date)
    current_time = delorean.Delorean()
    if (current_time-delorean_object) < datetime.timedelta(5):
        human_date = delorean_object.humanize()
        print(f'Event {index} happened', human_date)
    else:
        print(f'Event {index} happened on', delorean_object.date)


この結果は

Event 0 happened 14 hours ago
Event 1 happened on 2021-06-05


これはとても理にかなっています。

なぜなら、もし昨日何かが起こったと誰かに言うなら、それを理解するために必要な思考はそれほど多くないからです。

しかし、もしあなたが1ヶ月前に何かが起こったと言うなら、彼らはおそらくそれがいつだったかを知るためにカレンダーを見るでしょう。

デロリアンを使って相対的な日付の人間性を高める

デロリアンは、日付と日付の関連付けを、非常に直感的で人間らしい方法で簡単に行うことができます。

来週の金曜日の今頃に会いましょう。

これは、人々にはよく理解されていますが、 timedelta を使って手作業でコーディングするのは退屈なものです。

next_last_` を曜日や月、年などと組み合わせて使うことで、すでに存在する日時を元にデロリアンオブジェクトを計算し、作成することができます。

from delorean import Delorean


dt_tm = Delorean()
nxt_fri = dt_tm.next_friday()
print("Friday next week: ", nxt_fri)


# Date for Two Fridays ago
two_fridays_ago = dt_tm.last_friday(2)
print("Friday two weeks ago: ", two_fridays_ago)


# Get Two Fridays from now at midnight
two_fridays_from_now_at_midnight = dt_tm.next_friday(2).midnight
print("Two Fridays from now at midnight: ", two_fridays_from_now_at_midnight)


# Get this time next month
next_month = dt_tm.next_month()
print("This time next month: ", next_month)


# Get this time next year, at midnight
next_month = dt_tm.next_year().midnight
print("This time next month: ", next_month)


先週や来週だけでなく、ある週のある日の日付を取得するために、何週目かを表す数値を渡します。

日、月、年についても同様である。

Friday next week:  Delorean(datetime=datetime.datetime(2021, 7, 16, 19, 25, 34, 427028), timezone='UTC')
Friday two weeks ago:  Delorean(datetime=datetime.datetime(2021, 7, 2, 19, 25, 34, 427028), timezone='UTC')
Two Fridays from now at midnight:  2021-07-23 00:00:00+00:00
This time next month:  Delorean(datetime=datetime.datetime(2021, 8, 11, 19, 25, 34, 427028), timezone='UTC')
This time next month:  2022-07-11 00:00:00+00:00


結論

このガイドでは、PythonでDelorean datetimeオブジェクトをヒューマナイズする方法について見てきました。

ヒューマナイズとは、datetimeインスタンスをより人間的な形式に変換するプロセスです – 言葉と相対的な時間枠を使用します。

これらの時間枠の相対性を考慮すると、あるケースでは日付のヒューマナイズが意味を持ちますが、他のケースではそうでありません。

タイトルとURLをコピーしました