parser parse example dateutil create python datetime human-readable datetime-parsing humanize

parse - Días naturales/relativos en Python



python strftime format (5)

Si bien no es útil para usted en este momento, puede serlo para futuros buscadores: el módulo Babel, que trata con todo tipo de cosas de la configuración regional, tiene una función para hacer más o menos lo que usted desea. Actualmente, solo está en su troncal, no en el último lanzamiento público (versión 0.9.4). Una vez que la funcionalidad aterrice en un lanzamiento, podrías hacer algo como:

from datetime import timedelta from babel.dates import format_timedelta delta = timedelta(days=6) format_timedelta(delta, locale=''en_US'') u''1 week''

Esto se toma directamente de la documentación de Babel sobre el formato delta de tiempo . Esto al menos te llevará partes del camino. No hará borrosidad hasta el nivel de "momentos atrás" y tal, pero hará "n minutos" etc. correctamente pluralizados.

Por lo que vale, el módulo Babel también contiene funciones para formatear fechas y horas de acuerdo con la configuración regional, lo que podría ser útil cuando el delta del tiempo es grande.

Me gustaría una forma de mostrar los tiempos naturales para los artículos con fecha en Python. Similar a cómo Twitter mostrará un mensaje de "hace un momento", "hace unos minutos", "hace dos horas", "hace tres días", etc.

Django 1.0 tiene un método de "humanización" en django.contrib. No estoy usando el framework Django, y aunque lo fuera, es más limitado de lo que me gustaría.

Permítanme a mí (y a las generaciones de futuros buscadores) saber si ya existe una buena solución de trabajo. Como esta es una tarea bastante común, imagino que debe haber algo.


Está el paquete humanizado :

>>> 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''

Ejemplos para su caso de uso:

>>> 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''

Además (ver enlace arriba) también es compatible con la humanización de:

  • enteros
  • tamaños de archivo
  • flotadores (a números fraccionarios)

¿Estás buscando algo como esto (imprimir fechas relativas en Python)?


O bien, podría adaptar timesince.py desde Django, que solo tiene otras 2 dependencias: una para la traducción (que puede que no necesite) y otra para las zonas horarias (que se pueden adaptar fácilmente).

Por cierto, Django tiene una licencia BSD que es bastante flexible, podrás usarla en cualquier proyecto que estés usando actualmente.


Las fechas de Twitter específicas son interesantes porque son relativas solo para el primer día. Después de 24 horas, solo muestran el mes y el día. Después de un año comienzan a mostrar los últimos dos dígitos del año. Aquí hay una función de muestra que hace algo más parecido a las fechas relativas de Twitter, aunque siempre muestra el año también después de 24 horas. Es solo la configuración regional de EE. UU., Pero siempre puede modificarla según sea necesario.

# 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)