¿Cómo puedo extraer la fecha de una cadena como “monkey 2010-07-10 love banana”? ¡Gracias!
Si la fecha se da en una forma fija, simplemente puede usar una expresión regular para extraer la fecha y “datetime.datetime.strptime” para analizar la fecha:
match = re.search(r'\d{4}-\d{2}-\d{2}', text) date = datetime.strptime(match.group(), '%Y-%m-%d').date()
De lo contrario, si la fecha se da de forma arbitraria, no podrá extraerla fácilmente.
Usando python-dateutil :
In [1]: import dateutil.parser as dparser In [18]: dparser.parse("monkey 2010-07-10 love banana",fuzzy=True) Out[18]: datetime.datetime(2010, 7, 10, 0, 0)
Las fechas no ValueError
un ValueError
:
In [19]: dparser.parse("monkey 2010-07-32 love banana",fuzzy=True) # ValueError: day is out of range for month
Puede reconocer fechas en muchos formatos:
In [20]: dparser.parse("monkey 20/01/1980 love banana",fuzzy=True) Out[20]: datetime.datetime(1980, 1, 20, 0, 0)
Tenga en cuenta que hace una conjetura si la fecha es ambigua:
In [23]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True) Out[23]: datetime.datetime(1980, 10, 1, 0, 0)
Pero la forma en que analiza las fechas ambiguas es personalizable:
In [21]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True, dayfirst=True) Out[21]: datetime.datetime(1980, 1, 10, 0, 0)
Para extraer la fecha de una cadena en Python; El mejor módulo disponible es el módulo de buscador de fecha .
Puede usarlo en su proyecto de Python siguiendo los sencillos pasos que se indican a continuación.
pip install datefinder
import datefinder input_string = "monkey 2010-07-10 love banana" # a generator will be returned by the datefinder module. I'm typecasting it to a list. Please read the note of caution provided at the bottom. matches = list(datefinder.find_dates(input_string)) if len(matches) > 0: # date returned will be a datetime.datetime object. here we are only using the first match. date = matches[0] print date else: print 'No dates found'
nota: si está esperando un gran número de coincidencias; entonces no se recomendará una conversión a la lista, ya que tendrá una gran sobrecarga de rendimiento.
Usando Pygrok, puede definir extensiones abstraídas a la syntax de Expresión Regular.
Los patrones personalizados se pueden incluir en su expresión regular en el formato %{PATTERN_NAME}
.
También puede crear una etiqueta para ese patrón, separándola con dos puntos: %s{PATTERN_NAME:matched_string}
. Si el patrón coincide, el valor se devolverá como parte del diccionario resultante (por ejemplo, result.get('matched_string')
)
Por ejemplo:
from pygrok import Grok input_string = 'monkey 2010-07-10 love banana' date_pattern = '%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}' grok = Grok(date_pattern) print(grok.match(input_string))
El valor resultante será un diccionario:
{'month': '07', 'day': '10', 'year': '2010'}
Si el date_pattern no existe en el input_string, el valor de retorno será None
. Por el contrario, si su patrón no tiene ninguna etiqueta, devolverá un diccionario vacío {}
Referencias:
Si conoce la posición del objeto de fecha en la cadena (por ejemplo, en un archivo de registro), puede usar .split () [índice] para extraer la fecha sin conocer completamente el formato.
Por ejemplo:
>>> string = 'monkey 2010-07-10 love banana' >>> date = string.split()[1] >>> date '2010-07-10'