Analizar la cadena de fecha y cambiar el formato


115

Tengo una cadena de fecha con el formato 'Lunes 15 de febrero de 2010'. Quiero cambiar el formato a '15 / 02/2010 '. ¿Cómo puedo hacer esto?


Respuestas:


153

datetime módulo podría ayudarlo con eso:

datetime.datetime.strptime(date_string, format1).strftime(format2)

Para el ejemplo específico, podría hacer

>>> datetime.datetime.strptime('Mon Feb 15 2010', '%a %b %d %Y').strftime('%d/%m/%Y')
'15/02/2010'
>>>

2
datetime.datetime (lunes 15 de febrero de 2010, "% a% b% d% Y"). strftime ("% d /% m /% Y") ¿Es correcto? pero tengo un error.
Nimmy

1
@nimmyliji: se corrigió 10 minutos antes de que publicaras tu comentario. y por supuesto deberías tenerlo date_stringcomo una cadena.
SilentGhost

3
un ejemplo completamente funcional, por favor;) ¿qué importación / ... se requiere?
Codeling

format1debe ser una cadena para expresar el formato de la cadena de fecha de entrada. format2es el formato de cadena de destino para la salida.
ThorSummoner

1
¿Puede dar más detalles, cómo debería verse format1 en este ejemplo?
user1767754

59

Puede instalar la biblioteca dateutil . Su parsefunción puede averiguar en qué formato está una cadena sin tener que especificar el formato como lo hace usted datetime.strptime.

from dateutil.parser import parse
dt = parse('Mon Feb 15 2010')
print(dt)
# datetime.datetime(2010, 2, 15, 0, 0)
print(dt.strftime('%d/%m/%Y'))
# 15/02/2010

dateutil.parse es una mejor alternativa si se desconoce el formato exacto de una cadena ISO legal. ISO puede contener microsegundos o no. Puede contener o no una "Z" al final. datetime.strptime no es lo suficientemente flexible para adaptarse a eso.
Michael Kariv

4
Pase Date debe usarse con cuidado. parse ('12 .07.2017 ') devuelve datetime (2017, 12, 7, ..) pero parse ('13 .07.2017') devuelve .datetime (2017, 7, 13, ...)
ego2dot0

En python 3.xlas necesidades de instalarpython-dateutil pip install python-dateutil
AB Abhi

24
>>> from_date="Mon Feb 15 2010"
>>> import time                
>>> conv=time.strptime(from_date,"%a %b %d %Y")
>>> time.strftime("%d/%m/%Y",conv)
'15/02/2010'


14

Como esta pregunta surge a menudo, aquí está la explicación simple.

datetimeo timemódulo tiene dos funciones importantes.

  • strftime : crea una representación de cadena de fecha u hora a partir de un objeto de fecha y hora u hora.
  • strptime : crea un objeto de fecha y hora a partir de una cadena.

En ambos casos, necesitamos una cadena de formato. Es la representación que indica cómo se formatea la fecha o la hora en su cadena.

Ahora supongamos que tenemos un objeto de fecha.

>>> from datetime import datetime
>>> d = datetime(2010, 2, 15)
>>> d
datetime.datetime(2010, 2, 15, 0, 0)

Si queremos crear una cadena a partir de esta fecha en el formato 'Mon Feb 15 2010'

>>> s = d.strftime('%a %b %d %y')
>>> print s
Mon Feb 15 10

Supongamos que queremos convertir esto snuevamente en un datetimeobjeto.

>>> new_date = datetime.strptime(s, '%a %b %d %y')
>>> print new_date
2010-02-15 00:00:00

Consulte este documento todas las directivas de formato con respecto a la fecha y hora.


Me encanta tu explicación.
mejora el

2

Solo para completar: cuando analice una fecha utilizando strptime()y la fecha contiene el nombre de un día, mes, etc., tenga en cuenta que debe tener en cuenta la configuración regional.

También se menciona como nota a pie de página en los documentos .

Como ejemplo:

import locale
print(locale.getlocale())

>> ('nl_BE', 'ISO8859-1')

from datetime import datetime
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> ValueError: time data '6-Mar-2016' does not match format '%d-%b-%Y'

locale.setlocale(locale.LC_ALL, 'en_US')
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> '2016-03-06'

2

@codeling y @ user1767754: Las siguientes dos líneas funcionarán. Vi que nadie publicó la solución completa para el problema de ejemplo que se preguntó. Con suerte, esta es una explicación suficiente.

import datetime

x = datetime.datetime.strptime("Mon Feb 15 2010", "%a %b %d %Y").strftime("%d/%m/%Y")
print(x)

Salida:

15/02/2010

1

También puede lograr esto usando pandas:

import pandas as pd

pd.to_datetime('Mon Feb 15 2010', format='%a %b %d %Y').strftime('%d/%m/%Y')

Salida:

'15/02/2010'

Puede aplicar el enfoque de pandas para diferentes tipos de datos como:

import pandas as pd
import numpy as np

def reformat_date(date_string, old_format, new_format):
    return pd.to_datetime(date_string, format=old_format, errors='ignore').strftime(new_format)

date_string = 'Mon Feb 15 2010'
date_list = ['Mon Feb 15 2010', 'Wed Feb 17 2010']
date_array = np.array(date_list)
date_series = pd.Series(date_list)

old_format = '%a %b %d %Y'
new_format = '%d/%m/%Y'

print(reformat_date(date_string, old_format, new_format))
print(reformat_date(date_list, old_format, new_format).values)
print(reformat_date(date_array, old_format, new_format).values)
print(date_series.apply(lambda x: reformat_date(x, old_format, new_format)).values)

Salida:

15/02/2010
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.