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?

Nimmy
fuente
Duplicado de todos estos: stackoverflow.com/search?q=%5Bpython%5D+parse+date . Duplicado exacto de esto: stackoverflow.com/questions/1713594/…
S.Lott

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'
>>>
SilentGhost
fuente
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
llazzaro
fuente
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'
ghostdog74
fuente
23

convertir cadena en objeto de fecha y hora

from datetime import datetime
s = "2016-03-26T09:25:55.000Z"
f = "%Y-%m-%dT%H:%M:%S.%fZ"
out = datetime.strptime(s, f)
print(out)
output:
2016-03-26 09:25:55
anjaneyulubatta505
fuente
Esto no está de acuerdo con el formato que pidió, que tenía una cadena de mes "Feb".
Shahir Ansari
@ShahirAnsari puede cambiar el formato como desee, consulte " docs.python.org/3/library/datetime.html "
anjaneyulubatta505
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.

Thavan
fuente
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'
ƘɌỈSƬƠƑ
fuente
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
Gobryas
fuente
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']
nimbo
fuente