Convirtiendo la cadena “1 de junio de 2005 1:33 p. m.” en fecha y hora

8 minutos de lectura

avatar de usuario
oli

¿Cómo convierto la siguiente cadena en un objeto de fecha y hora?

"Jun 1 2005  1:33PM"

  • A menos que esté seguro de que un formato maneja cada fecha y hora (sin ”, sin NaN, sin incompletos, sin discrepancias de formato, sin caracteres finales, zonas horarias, marcas de tiempo de microsegundos u otro texto…), la felicidad excepcional de strptime() te volverá loco, a menos que lo envuelvas. Vea mi respuesta, basada en la respuesta de Or Weis a esto

    – smci

    15 de diciembre de 2017 a las 3:00


  • El enfoque más perezoso y más ampliamente utilizable que conozco es dateparser (verifique blog.scrapinghub.com/2015/11/09/…). Funciona incluso con expresiones de tiempo en lenguaje natural en varios idiomas listos para usar. Aunque supongo que puede ser lento.

    – Armando

    1 de noviembre de 2019 a las 17:23

  • Hay un enlace útil aquí: stackabuse.com/converting-strings-to-datetime-in-python

    – Siguiendo mi camino

    4 de enero de 2020 a las 14:37

  • datetime.strptime como otros han mencionado. Para aquellos que prefieren una explicación en video, mira aquí.

    – ben

    3 de febrero de 2021 a las 5:03


avatar de usuario
Patricio Harrington

datetime.strptime es la rutina principal para analizar cadenas en fechas y horas. Puede manejar todo tipo de formatos, con el formato determinado por una cadena de formato que le proporcione:

from datetime import datetime

datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

La resultante datetime el objeto es ingenuo de la zona horaria.

Enlaces:

Notas:

  • strptime = “tiempo de análisis de cadena”
  • strftime = “tiempo de formato de cadena”
  • Pronúncialo en voz alta hoy y no tendrás que volver a buscarlo en 6 meses.

Además, como se ve en un comentario hecho por @Izkata, si desea una fecha en lugar de una fecha y hora, pasar por la fecha y hora lo maneja muy bien:

datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)

  • ‘%b’, ‘%p’ puede fallar en una configuración regional distinta del inglés.

    – jfs

    29/04/2014 a las 10:55

  • ¿Cuál es la cadena? No tiene la hora, solo “25 de abril de 2014”

    – Usuario

    30 de abril de 2014 a las 1:56

  • @User Tendrá que saber con anticipación para excluir esa parte de la cadena de formato, pero si desea una date en lugar de un datetimeir a través datetime lo maneja muy bien: datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)

    – Izkatá

    11/11/2014 a las 20:02

  • Si sabe que la cadena representa una fecha y hora en UTC, puede obtener una zona horaria consciente datetime objeto agregando esta línea en Python 3: from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)

    – Flamm

    8 de diciembre de 2016 a las 10:28

  • En mi caso, la respuesta “stackoverflow.com/a/54830426/6784445” coincidía mejor y esperaba que pudiéramos incluirla en esta solución como complemento.

    – hm6

    4 de febrero a las 21:30


avatar de usuario
Simón Willison

Usar el tercero dateutil biblioteca:

from dateutil import parser
parser.parse("Aug 28 1999 12:00AM")  # datetime.datetime(1999, 8, 28, 0, 0)

Puede manejar la mayoría de los formatos de fecha, incluido el que necesita analizar. Es más conveniente que strptime ya que puede adivinar el formato correcto la mayor parte del tiempo.

Es muy útil para escribir pruebas, donde la legibilidad es más importante que el rendimiento.

Puedes instalarlo con:

pip install python-dateutil

  • Tenga en cuenta que para grandes cantidades de datos, esta podría no ser la forma más óptima de abordar el problema. Adivinar el formato cada vez puede ser terriblemente lento.

    – Paweł Polewicz

    3 de julio de 2011 a las 0:08

  • Esto es bueno, pero sería bueno tener una solución integrada en lugar de tener que acudir a un tercero.

    – brian dólar

    12/10/2011 a las 20:33

  • Esto es excelente para situaciones en las que no puede garantizar el formato de fecha.

    – Wisbucky

    14 de noviembre de 2021 a las 6:16

  • Si tiene formatos inciertos y algunos de ellos están incompletos, como June 2009 en vez de 12 June 2009, asumiría cualquier día arbitrario. Lo mismo ocurre con las fechas sin mes.

    – el procrastinador

    2 de marzo a las 10:06

avatar de usuario
florín

Verificar strptime en el tiempo módulo. es el inverso de strftime.

$ python
>>> import time
>>> my_time = time.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
time.struct_time(tm_year=2005, tm_mon=6, tm_mday=1,
                 tm_hour=13, tm_min=33, tm_sec=0,
                 tm_wday=2, tm_yday=152, tm_isdst=-1)

timestamp = time.mktime(my_time)
# convert time object to datetime
from datetime import datetime
my_datetime = datetime.fromtimestamp(timestamp)
# convert time object to date
from datetime import date
my_date = date.fromtimestamp(timestamp)

  • Por lo que entiendo, esta respuesta solo genera objetos de tiempo, no objetos de fecha y hora, por lo que la respuesta estaría enterrada en comparación con la respuesta de Patrick.

    – Alejandro Pájaro

    7 de septiembre de 2010 a las 13:08

avatar de usuario
supernova

Pitón >= 3.7

para convertir AAAA-MM-DD cadena al objeto de fecha y hora, datetime.fromisoformat puede ser usado.

from datetime import datetime

date_string = "2012-12-12 10:10:10"
print (datetime.fromisoformat(date_string))
2012-12-12 10:10:10

Precaución de los documentos:

Esto hace no Admite el análisis de cadenas ISO 8601 arbitrarias; solo se pretende que sea la operación inversa de datetime.isoformat(). Un analizador ISO 8601 más completo, dateutil.parser.isoparse está disponible en el paquete de terceros dateutil.

avatar de usuario
steve pico

He elaborado un proyecto que puede convertir algunas expresiones muy interesantes. Verificar cadena de tiempo.

Aquí hay algunos ejemplos a continuación:

pip install timestring

>>> import timestring
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm')
<timestring.Date 2015-08-15 20:40:00 4491909392>
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date
datetime.datetime(2015, 8, 15, 20, 40)
>>> timestring.Range('next week')
<timestring.Range From 03/10/14 00:00:00 to 03/03/14 00:00:00 4496004880>
>>> (timestring.Range('next week').start.date, timestring.Range('next week').end.date)
(datetime.datetime(2014, 3, 10, 0, 0), datetime.datetime(2014, 3, 14, 0, 0))

Recuerde esto y no necesita volver a confundirse en la conversión de fecha y hora.

Cadena al objeto de fecha y hora = strptime

objeto de fecha y hora a otros formatos = strftime

Jun 1 2005 1:33PM

es igual a

%b %d %Y %I:%M%p

%b Mes como nombre abreviado de la configuración regional (Jun)

%d Día del mes como un número decimal con relleno cero(1)

%Y Año con siglo como número decimal (2015)

%I Hora (reloj de 12 horas) como un número decimal con ceros (01)

%M Minuto como un número decimal con ceros(33)

%p Equivalente local de AM o PM (PM)

entonces necesitas strptime, es decir, convertir string a

>>> dates = []
>>> dates.append('Jun 1 2005  1:33PM')
>>> dates.append('Aug 28 1999 12:00AM')
>>> from datetime import datetime
>>> for d in dates:
...     date = datetime.strptime(d, '%b %d %Y %I:%M%p')
...     print type(date)
...     print date
... 

Producción

<type 'datetime.datetime'>
2005-06-01 13:33:00
<type 'datetime.datetime'>
1999-08-28 00:00:00

¿Qué sucede si tiene un formato diferente de fechas? Puede usar panda o dateutil.parse

>>> import dateutil
>>> dates = []
>>> dates.append('12 1 2017')
>>> dates.append('1 1 2017')
>>> dates.append('1 12 2017')
>>> dates.append('June 1 2017 1:30:00AM')
>>> [parser.parse(x) for x in dates]

Producción

[datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 12, 0, 0), datetime.datetime(2017, 6, 1, 1, 30)]

Muchas marcas de tiempo tienen una zona horaria implícita. Para asegurarse de que su código funcione en todas las zonas horarias, debe usar UTC internamente y adjuntar una zona horaria cada vez que un objeto extraño ingrese al sistema.

Pitón 3.2+:

>>> datetime.datetime.strptime(
...     "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))

Esto supone que conoce el desplazamiento. Si no lo sabe, pero sabe, por ejemplo, la ubicación, puede usar el pytz paquete para consultar el Base de datos de zonas horarias de la IANA para el desplazamiento. Usaré Teherán aquí como ejemplo porque tiene una diferencia de media hora:

>>> tehran = pytz.timezone("Asia/Tehran")
>>> local_time = tehran.localize(
...   datetime.datetime.strptime("March 5, 2014, 20:13:50",
...                              "%B %d, %Y, %H:%M:%S")
... )
>>> local_time
datetime.datetime(2014, 3, 5, 20, 13, 50, tzinfo=<DstTzInfo 'Asia/Tehran' +0330+3:30:00 STD>)

Como puedes ver, pytz ha determinado que la compensación fue de +3:30 en esa fecha en particular. Ahora puede convertir esto a la hora UTC y aplicará el desplazamiento:

>>> utc_time = local_time.astimezone(pytz.utc)
>>> utc_time
datetime.datetime(2014, 3, 5, 16, 43, 50, tzinfo=<UTC>)

Tenga en cuenta que las fechas anteriores a la adopción de zonas horarias le darán compensaciones extrañas. Esto se debe a que la IANA ha decidido utilizar Hora media local:

>>> chicago = pytz.timezone("America/Chicago")
>>> weird_time = chicago.localize(
...   datetime.datetime.strptime("November 18, 1883, 11:00:00",
...                              "%B %d, %Y, %H:%M:%S")
... )
>>> weird_time.astimezone(pytz.utc)
datetime.datetime(1883, 11, 18, 7, 34, tzinfo=<UTC>)

Las extrañas “7 horas y 34 minutos” se derivan de la longitud de Chicago. Usé esta marca de tiempo porque es justo antes la hora estandarizada fue adoptada en Chicago.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad