python - yyyymmdd - strptime




Conversione di stringa in datetime (13)

Breve e semplice Ho una lista enorme di date-ora come queste stringhe:

Jun 1 2005  1:33PM
Aug 28 1999 12:00AM

Sto andando a spingerli di nuovo in campi datetime appropriati in un database, quindi ho bisogno di trasformarli in oggetti datetime reali.

Qualsiasi aiuto (anche se è solo un calcio nella giusta direzione) sarebbe apprezzato.

Modifica: questo sta analizzando l'ORM di Django, quindi non posso usare SQL per eseguire la conversione sull'inserto.


Crea una piccola funzione di utilità come:

def date(datestr="", format="%Y-%m-%d"):
    from datetime import datetime
    if not datestr:
        return datetime.today().date()
    return datetime.strptime(datestr, format).date()

Questo è abbastanza versatile:

  • Se non si passa nessun argomento restituirà la data di oggi.
  • C'è un formato data come predefinito che puoi sostituire.
  • Puoi facilmente modificarlo per restituire un datetime.

Ecco due soluzioni che utilizzano Pandas per convertire date formattate come stringhe in oggetti datetime.date.

import pandas as pd

dates = ['2015-12-25', '2015-12-26']

# 1) Use a list comprehension.
>>> [d.date() for d in pd.to_datetime(dates)]
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

# 2) Convert the dates to a DatetimeIndex and extract the python dates.
>>> pd.DatetimeIndex(dates).date.tolist()
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

Tempi

dates = pd.DatetimeIndex(start='2000-1-1', end='2010-1-1', freq='d').date.tolist()

>>> %timeit [d.date() for d in pd.to_datetime(dates)]
# 100 loops, best of 3: 3.11 ms per loop

>>> %timeit pd.DatetimeIndex(dates).date.tolist()
# 100 loops, best of 3: 6.85 ms per loop

Ed ecco come convertire gli esempi originali di data-ora dell'OP:

datetimes = ['Jun 1 2005  1:33PM', 'Aug 28 1999 12:00AM']

>>> pd.to_datetime(datetimes).to_pydatetime().tolist()
[datetime.datetime(2005, 6, 1, 13, 33), 
 datetime.datetime(1999, 8, 28, 0, 0)]

Ci sono molte opzioni per la conversione dalle stringhe ai timestamp di Pandas usando to_datetime , quindi controlla i docs se hai bisogno di qualcosa di speciale.

Allo stesso modo, i Timestamp hanno molte proprietà e metodi a cui è possibile accedere in aggiunta a .date


Ho messo insieme un progetto in grado di convertire alcune espressioni veramente pulite. Controlla il timestring .

Ecco alcuni esempi qui sotto:

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))

Il modulo Python datetime è utile per ottenere la data e la conversione dei formati di data e ora.

import datetime

new_date_format1 = datetime.datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
new_date_format2 = datetime.datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p').strftime('%Y/%m/%d %I:%M%p')
print new_date_format1
print new_date_format2

Produzione:

2005-06-01 13:33:00
2005/06/01 01:33PM

Personalmente mi piace la soluzione che utilizza il modulo parser , che è la seconda Risposta a questa domanda ed è bella, in quanto non è necessario costruire alcun letterale stringa per farlo funzionare. Tuttavia, uno svantaggio è che è il 90% più lento rispetto alla risposta accettata con tempo strptime .

from dateutil import parser
from datetime import datetime
import timeit

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

print(timeit.timeit(stmt=dt, number=10**5))
print(timeit.timeit(stmt=strptime, number=10**5))
>10.70296801342902
>1.3627995655316933

Finché non lo fai ripetutamente un milione di volte, continuo a pensare che il metodo parser sia più conveniente e gestirà automaticamente la maggior parte del tempo.


Puoi usare easy_date per semplificare:

import date_converter
converted_date = date_converter.string_to_datetime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

Ricorda questo e non hai più bisogno di confondermi nella conversione datetime.

Stringa su oggetto datetime = strptime

oggetto datetime in altri formati = strftime

Jun 1 2005 1:33PM

è uguale a

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

% b mese come nome abbreviato delle impostazioni locali (giugno)

% d Giorno del mese come numero decimale con zero cifre (1)

% Y Anno con il secolo come numero decimale (2015)

% I Ora (12 ore) come numero decimale a zero (01)

% M Minuto come numero decimale con riempimento zero (33)

% p equivalente in locale di AM o PM (PM)

quindi è necessario strptime ovvero convertire la string in

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

Produzione

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

Che cosa succede se si dispone di un diverso formato di date è possibile utilizzare 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]

Produzione

[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)]

Sarebbe utile per la conversione da stringa a datetime e anche con fuso orario

def convert_string_to_time(date_string, timezone):
    from datetime import datetime
    import pytz
    date_time_obj = datetime.strptime(date_string[:26], '%Y-%m-%d %H:%M:%S.%f')
    date_time_obj_timezone = pytz.timezone(timezone).localize(date_time_obj)

    return date_time_obj_timezone

date = '2018-08-14 13:09:24.543953+00:00'
TIME_ZONE = 'UTC'
date_time_obj_timezone = convert_string_to_time(date, TIME_ZONE)

Se si desidera solo il formato della data, è possibile convertirlo manualmente passando i singoli campi come:

>>> import datetime
>>> date = datetime.date(int('2017'),int('12'),int('21'))
>>> date
datetime.date(2017, 12, 21)
>>> type(date)
<type 'datetime.date'>

Puoi passare i valori della stringa divisa per convertirli in un tipo di data come:

selected_month_rec = '2017-09-01'
date_formate = datetime.date(int(selected_month_rec.split('-')[0]),int(selected_month_rec.split('-')[1]),int(selected_month_rec.split('-')[2]))

Otterrai il valore risultante nel formato della data.


Usa la libreria di dateutil terze parti:

from dateutil import parser
dt = parser.parse("Aug 28 1999 12:00AM")

Può gestire la maggior parte dei formati di data, tra cui quello che è necessario analizzare. È più conveniente rispetto al tempo in quanto può indovinare il formato corretto per la maggior parte del tempo.

È molto utile per scrivere test, in cui la leggibilità è più importante delle prestazioni.

Puoi installarlo con:

pip install python-dateutil

datetime.strptime è la routine principale per l'analisi delle stringhe in periodi di tempo. Può gestire tutti i tipi di formati, con il formato determinato da una stringa di formato che gli viene assegnata:

from datetime import datetime

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

L'oggetto datetime risultante è timezone-naive.

link:

Gli appunti:

  • strptime = "tempo di analisi della stringa"
  • strftime = "tempo formato stringa"
  • Esprimilo ad alta voce oggi e non dovrai cercarlo di nuovo tra 6 mesi.

arrow offre molte funzioni utili per date e orari. Questo bit di codice fornisce una risposta alla domanda e mostra che la freccia è anche in grado di formattare facilmente le date e visualizzare le informazioni per altre impostazioni locali.

>>> import arrow
>>> dateStrings = [ 'Jun 1  2005 1:33PM', 'Aug 28 1999 12:00AM' ]
>>> for dateString in dateStrings:
...     dateString
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').datetime
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').format('ddd, Do MMM YYYY HH:mm')
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').humanize(locale='de')
...
'Jun 1  2005 1:33PM'
datetime.datetime(2005, 6, 1, 13, 33, tzinfo=tzutc())
'Wed, 1st Jun 2005 13:33'
'vor 11 Jahren'
'Aug 28 1999 12:00AM'
datetime.datetime(1999, 8, 28, 0, 0, tzinfo=tzutc())
'Sat, 28th Aug 1999 00:00'
'vor 17 Jahren'

Vedi http://arrow.readthedocs.io/en/latest/ per ulteriori informazioni.


In [34]: import datetime

In [35]: _now = datetime.datetime.now()

In [36]: _now
Out[36]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [37]: print _now
2016-01-19 09:47:00.432000

In [38]: _parsed = datetime.datetime.strptime(str(_now),"%Y-%m-%d %H:%M:%S.%f")

In [39]: _parsed
Out[39]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [40]: assert _now == _parsed




datetime