Pythonの自然/相対日
-
03-07-2019 - |
質問
日付付きアイテムの自然な時間をPythonで表示する方法が欲しい。 Twitterが「ちょっと前」、「数分前」、「2時間前」、「3日前」などからのメッセージを表示する方法に似ています
Django 1.0には「ヒューマナイズ」機能があります。 django.contribのメソッド。私はDjangoフレームワークを使用していません。使用したとしても、私が望むものよりも制限されています。
すでに有効な解決策があるかどうか、私(および将来の検索者の世代)に知らせてください。これは十分に一般的なタスクなので、何かがあるに違いないと思います。
解決
現時点では役に立ちませんが、将来の検索者にとっては役に立つかもしれません。 あらゆる種類のロケールを扱うbabelモジュールには、お望みの処理を多かれ少なかれ実行する機能があります。現在のところ、最新のパブリックリリース(バージョン0.9.4)ではなく、トランクにのみあります。機能がリリースされると、次のようなことができます:
from datetime import timedelta
from babel.dates import format_timedelta
delta = timedelta(days=6)
format_timedelta(delta, locale='en_US')
u'1 week'
これは、タイムデルタフォーマットのbabelドキュメントから直接取得したものです。 。これは少なくとも道の一部を取得します。 「一瞬前」のレベルまで曖昧になりません。などが、それは「n分」を行います;などを正しく複数化します。
価値のあるものとして、babelモジュールには、ロケールに従って日付と時刻をフォーマットするための関数も含まれています。これは、時間差が大きい場合に便利です。
他のヒント
Twitterの具体的な日付は、最初の日のみ相対的であるため、興味深いものです。 24時間後、彼らは月と日を表示するだけです。 1年後、彼らは年の下2桁を表示し始めます。以下は、Twitterの相対的な日付に似た機能を実行するサンプル関数です。ただし、24時間後も常に年が表示されます。米国ロケールのみですが、必要に応じていつでも変更できます。
# tested in Python 2.7
import datetime
def prettydate(d):
diff = datetime.datetime.utcnow() - d
s = diff.seconds
if diff.days > 7 or diff.days < 0:
return d.strftime('%d %b %y')
elif diff.days == 1:
return '1 day ago'
elif diff.days > 1:
return '{} days ago'.format(diff.days)
elif s <= 1:
return 'just now'
elif s < 60:
return '{} seconds ago'.format(s)
elif s < 120:
return '1 minute ago'
elif s < 3600:
return '{} minutes ago'.format(s/60)
elif s < 7200:
return '1 hour ago'
else:
return '{} hours ago'.format(s/3600)
humanizeパッケージがあります:
>>> import humanize
>>> import datetime
>>> humanize.naturalday(datetime.datetime.now())
'today'
>>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1))
'yesterday'
>>> humanize.naturalday(datetime.date(2007, 6, 5))
'Jun 05'
>>> humanize.naturaldate(datetime.date(2007, 6, 5))
'Jun 05 2007'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1))
'a second ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600))
'an hour ago'
ユースケースの例:
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=36000))
'10 hours ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=360000))
'4 days ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600000))
'a month ago'
さらに(上記のリンクを参照)、以下の人間化もサポートしています:
- 整数
- ファイルサイズ
- floats(小数へ)
または timesince.py Djangoからは、それ自体に2つの依存関係しかありません。1つは翻訳用(必要ではないかもしれません)、もう1つはタイムゾーン用(簡単に調整可能)です。
ところで、 Djangoには非常に柔軟なBSDライセンスがあります、現在使用しているプロジェクトで使用できます。
このようなものを探していますか(相対日付の印刷Pythonで)?