Extraer la fecha de una cadena en Python

¿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.

Paso 1: Instalar el paquete datefinder

 pip install datefinder 

Paso 2: Úsalo en tu proyecto

 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:

  • Pygrok (Github)
  • Definiciones Preinstaladas de Pygrok (Github)

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'