example - ¿Cuál es la mejor manera de hacer un tiempo de "Hoy" o "Ayer" y un tiempo en Python?
timedelta python example (2)
Python tiene un muy buen análisis de fechas, pero es la única forma de reconocer una fecha y hora como "Hoy a las 3:20 PM" o "Ayer a las 11:06 AM" creando una nueva fecha hoy y haciendo sustracciones.
Todavía no estoy completamente actualizado con Python, pero tu pregunta me interesó, así que busqué un poco.
La resta de fecha usando timedelta
es, de lejos, la solución más común que encontré.
Como su pregunta es la única forma de hacerlo, revisé los códigos de formato de tiempo completo para ver si podía definir el suyo propio. Lamentablemente no. De la documentación de tiempo de Python:
... El conjunto completo de códigos de formato admitidos varía en todas las plataformas, porque Python llama a la función strftime () de la biblioteca de la plataforma C y las variaciones de plataforma son comunes.
La siguiente es una lista de todos los códigos de formato que requiere el estándar C (versión 1989) ...
De todos modos, esta no es una respuesta definitiva, pero tal vez les ahorrará a otros el tiempo de ladrar en el árbol equivocado.
Una biblioteca que me gusta mucho, y cada vez veo más personas, es python-dateutil, pero desafortunadamente ni el otro analizador tradicional de grandes fechas , mxDateTime de Egenix puede analizar la palabra "mañana" a pesar de ambas bibliotecas tener analizadores "difusos" muy potentes.
La única biblioteca que he visto que puede hacer esto es magicdate . Ejemplos:
>>> import magicdate
>>> magicdate.magicdate(''today'')
datetime.date(2009, 2, 15)
>>> magicdate.magicdate(''tomorrow'')
datetime.date(2009, 2, 16)
>>> magicdate.magicdate(''yesterday'')
datetime.date(2009, 2, 14)
Lamentablemente, esto solo devuelve objetos datetime.date, por lo que no incluirá partes de tiempo y no puede manejar su ejemplo de "Hoy 3:20 PM".
Entonces, necesitas mxDateTime para eso. Ejemplos:
>>> import mx.DateTime
>>> mx.DateTime.Parser.DateTimeFromString("Today 3:20 PM")
<mx.DateTime.DateTime object for ''2009-02-15 15:20:00.00'' at 28faa28>
>>> mx.DateTime.Parser.DateTimeFromString("Tomorrow 5:50 PM")
<mx.DateTime.DateTime object for ''2009-02-15 17:50:00.00'' at 2a86088>
EDITAR: mxDateTime.Parser solo analiza el tiempo en estos ejemplos e ignora las palabras "hoy" y "mañana". Entonces, para este caso en particular, necesita usar un combo de magicdate para obtener la fecha y mxDateTime para obtener el tiempo. Mi recomendación es usar python-dateutils o mxDateTime y solo aceptar los formatos de cadena que pueden analizar.
EDIT 2: Como se observa en los comentarios, parece que python-dateutil ahora puede manejar el análisis difuso. También descubrí el módulo parsedatetime que se desarrolló para su uso en Chandler y funciona con las consultas en esta pregunta:
>>> import parsedatetime.parsedatetime as pdt
>>> import parsedatetime.parsedatetime_consts as pdc
>>> c=pdc.Constants()
>>> p=pdt.Calendar(c)
>>> p.parse(''Today 3:20 PM'')
((2010, 3, 12, 15, 20, 0, 4, 71, -1), 3)
>>> p.parse(''Yesterday 11:06 AM'')
((2010, 3, 11, 11, 6, 0, 3, 70, -1), 3)
y para referencia aquí está la hora actual:
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2010, 3, 12, 15, 23, 35, 951652)