Parsarea datei și a timestamp-urilor în Python cu formatul time.strptime (Programare, Python, Timp, Fus Orar, Strptime)

TGanoe a intrebat.

Serverul meu cloud înregistrează ora în acest format:

[17/Dec/2011:09:48:49 -0600]

Pentru a-l citi în variabile Python, pot spune:

>>>str = '17/Dec/2011:09:48:49 -0600'
>>>import time
>>>print  time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600")

Rezultat:

time.struct_time(tm_year=2011, tm-mon=12, tm=mday=17, tm_hour=9, tm_min=48, tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1)

sau pot încerca

>>>mytime = time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600")
>>>print mytime.tm_hour

Rezultat:

9

Ce înseamnă -0600 face? Mă așteptam să ajusteze valoarea orei în obiectul dată-timp? Există vreun wildcard care să fie folosit în loc de a codifica în mod greșit valoarea -0600?

3 răspunsuri
Don Spaulding

-0600 este decalajul față de Greenwich Mean Time (GMT). După cum spune deja o altă întrebare SO, time.strptime nu poate citi decalajele de fus orar, deși datetime.strftime le poate genera.

După cum se explică la începutul secțiunii datetime documentației modulului, există două moduri de abordare a „timpului” în python, naiv sau conștient. Atunci când tot ce vă interesează este timpul în interiorul sistemului dvs., atunci este bine să vă ocupați de obiectele naive de timp/datetime (caz în care puteți elimina decalajul, așa cum a sugerat Alan). Atunci când trebuie să comparați valorile din interiorul sistemului dvs. cu valorile cu noțiunea de timp din lumea reală, trebuie să începeți să aveți de-a face cu acel decalaj.

ușor de a face față acestui lucru este doar să utilizați python-dateutil. Acesta are un funcție parse care va face tot posibilul să potrivească șirul de date pe care îl treceți în mai multe formate și să returneze o instanță de dată care reprezintă cea mai bună presupunere a ceea ce ați vrut să spuneți.

>>> from dateutil.parser import parse
>>> parse('17/Dec/2011:09:48:49 -0600', fuzzy=True)
datetime.datetime(2011, 12, 17, 9, 48, 49, tzinfo=tzoffset(None, -21600))

În mod normal, faptul că un software își dă „cea mai bună presupunere” este un lucru rău. În acest caz, acest lucru pare justificat dacă formatele de intrare sunt stabile. Este greu să te descurci cu timpul în dezvoltarea de software, du-te la cumpărături.

Comentarii

  • Mă uit la python-dateutil. Nu am fost conștient de scopul său. –  > Por TGanoe.
alan

Este decalajul față de GMT. Dacă nu-l doriți, scoateți-l pur și simplu:

>>> import time
>>> line = '17/Dec/2011:09:48:49 -0600'
>>> line = line.split(' ')[0]
>>> print  time.strptime(line,"%d/%b/%Y:%H:%M:%S")
time.struct_time(tm_year=2011, tm_mon=12, tm_mday=17, tm_hour=9, tm_min=48,  tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1)

Comentarii

  • Îmi place modul în care ai împărțit data și ai luat primul indice pe o singură linie –  > Por TGanoe.
  • funcționează și cu expresii regulate: newdate = re.split(” „, myStr)[0] –  > Por TGanoe.
mgilson

strptime se potrivește pur și simplu cu modificatorii (%d,%b, , …) cu segmentele corespunzătoare din șirul de caractere și apoi convertește acea bucată de șir de caractere care se potrivește la un număr întreg. Deci, în cazul dvs. -0600 face doar ca șirul de format să se potrivească cu șirul de intrare.

Dacă doriți să ajustați ora cu un decalaj specificat, v-aș recomanda să folosiți un parametru datetime obiect.

>>>s = '17/Dec/2011:09:48:49 -0600'
>>>from datetime import datetime,timedelta
>>>mytime = datetime.strptime(s,"%d/%b/%Y:%H:%M:%S -0600")
>>>dt = timedelta(minutes=6*60)  #6 hours
>>>mytime-=dt
>>>print mytime
2011-12-17 03:48:49
>>>print mytime.hour
3

De asemenea, rețineți că, deoarece str este un builtin, în general nu este recomandabil să îl realocați.

Comentarii

  • Mulțumesc pentru că ați subliniat faptul că ați folosit str ca nume de variabilă. Un obicei prost! –  > Por TGanoe.