Este equipo de trabajo ha estado mucho tiempo investigando para dar resolución a tus búsquedas, te compartimos la respuesta y esperamos serte de mucha ayuda.
Solución:
También estaba buscando una solución para esto y no pude encontrar ninguna, así que un amigo y yo construimos una herramienta para hacer esto. Pensé en volver y compartir en caso de que otros lo encontraran útil.
datefinder: encuentra y extrae fechas dentro del texto
Aquí hay un ejemplo:
import datefinder
string_with_dates = '''
Central design committee session Tuesday 10/22 6:30 pm
Th 9/19 LAB: Serial encoding (Section 2.2)
There will be another one on December 15th for those who are unable to make it today.
Workbook 3 (Minimum Wage): due Wednesday 9/18 11:59pm
He will be flying in Sept. 15th.
We expect to deliver this between late 2021 and early 2022.
'''
matches = datefinder.find_dates(string_with_dates)
for match in matches:
print(match)
Si puede identificar los segmentos que realmente contienen la información de la fecha, analizarlos puede ser bastante simple con parsedatetime. Sin embargo, hay algunas cosas a considerar, a saber, que sus fechas no tienen años y debe elegir un lugar.
>>> import parsedatetime
>>> p = parsedatetime.Calendar()
>>> p.parse("December 15th")
((2013, 12, 15, 0, 13, 30, 4, 319, 0), 1)
>>> p.parse("9/18 11:59 pm")
((2014, 9, 18, 23, 59, 0, 4, 319, 0), 3)
>>> # It chooses 2014 since that's the *next* occurence of 9/18
No siempre funciona perfectamente cuando tienes texto superfluo.
>>> p.parse("9/19 LAB: Serial encoding")
((2014, 9, 19, 0, 15, 30, 4, 319, 0), 1)
>>> p.parse("9/19 LAB: Serial encoding (Section 2.2)")
((2014, 2, 2, 0, 15, 32, 4, 319, 0), 1)
Honestamente, este parece ser el tipo de problema que sería lo suficientemente simple como para analizar formatos particulares y elegir el más probable de cada oración. Más allá de eso, sería un problema decente de aprendizaje automático.
Me sorprende que no se mencione el método search_dates de SUTime y dateparser.
from sutime import SUTime
import os
import json
from dateparser.search import search_dates
str1 = "Let's meet sometime next Thursday"
# You'll get more information about these jar files from SUTime's github page
jar_files = os.path.join(os.path.dirname(__file__), 'jars')
sutime = SUTime(jars=jar_files, mark_time_ranges=True)
print(json.dumps(sutime.parse(str1), sort_keys=True, indent=4))
"""output:
[
"end": 33,
"start": 20,
"text": "next Thursday",
"type": "DATE",
"value": "2018-10-11"
]
"""
print(search_dates(str1))
#output:
#[('Thursday', datetime.datetime(2018, 9, 27, 0, 0))]
Aunque he probado otros módulos como dateutil, datefinder y natty (no pude hacer que patito trabajara con python), estos dos parecen dar los resultados más prometedores.
Los resultados de SUTime son más confiables y está claro en el fragmento de código anterior. Sin embargo, SUTime falla en algunos escenarios básicos como analizar un texto
“No estaré disponible hasta el 19/9”
o
“No estaré disponible entre (el 18 de septiembre y el 20 de septiembre).
No da resultado para el primer texto y solo da mes y año para el segundo texto. Sin embargo, esto se maneja bastante bien en el método search_dates. El método search_dates es más agresivo y dará todas las fechas posibles relacionadas con cualquier palabra en el texto de entrada.
Todavía no he encontrado una forma de analizar el texto estrictamente para fechas en search_methods. Si pudiera encontrar una manera de hacerlo, sería mi primera opción sobre SUTime y también me aseguraría de actualizar esta respuesta si la encuentro.
Si crees que te ha resultado de provecho este post, sería de mucha ayuda si lo compartes con el resto programadores así nos ayudas a difundir esta información.