Cum se convertește datatime în integer în python (Programare, Python, Datetime, Număr Întreg, Convertor)

Tomáš Konyárik a intrebat.

cum pot converti formatul AAAA-MM-DD hh:mm:ss în format întreg în python?de exemplu, 2014-02-12 20:51:14 -> în format întreg.

știu cum să convertesc doar hh:mm:ss dar nu și yyyy-mm-dd hh:mm:ss

def time_to_num(time_str):
    hh, mm , ss = map(int, time_str.split(':'))
    return ss + 60*(mm + 60*hh)

4 răspunsuri
ely

Depinde de ceea ce ar trebui să codifice integerul. Ai putea converti data într-un număr de milisecunde de la un moment anterior. Oamenii fac adesea acest lucru aplicat la ora 12:00 am 1 ianuarie 1970, sau 1900, etc., și măsoară timpul ca un număr întreg de milisecunde de la acel punct. La datetime (sau altele asemănătoare) va avea funcții care să facă acest lucru pentru dumneavoastră: de exemplu, puteți utiliza int(datetime.datetime.utcnow().timestamp()).

Dacă doriți să codificați semantic anul, luna și ziua, o modalitate de a face acest lucru este de a înmulți aceste componente cu valori de ordin de mărime suficient de mari pentru a le juxtapune în cadrul cifrelor întregi:

2012-06-13 –> 20120613 = 10.000 * (2012) + 100 * (6) + 1*(13)

def to_integer(dt_time):
    return 10000*dt_time.year + 100*dt_time.month + dt_time.day

De ex.

In [1]: import datetime

In [2]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:def to_integer(dt_time):
:    return 10000*dt_time.year + 100*dt_time.month + dt_time.day
:    # Or take the appropriate chars from a string date representation.
:--

In [3]: to_integer(datetime.date(2012, 6, 13))
Out[3]: 20120613

Dacă doriți, de asemenea, minute și secunde, atunci includeți doar alte ordine de mărime, după cum este necesar pentru a afișa cifrele.

Am întâlnit această a doua metodă foarte des în sistemele vechi, în special în sistemele care extrag date bazate pe date din baze de date SQL vechi.

Aceasta este foarte proastă. Ajungi să scrii o mulțime de coduri complicate pentru alinierea datelor, calcularea decalajelor de lună sau de zi, așa cum ar apărea în formatul întreg (de exemplu, resetarea lunii la 1 când treci de decembrie, apoi creșterea valorii anului) și o serie de calcule pentru conversia la și de la formatul întreg.

Cu excepția cazului în care o astfel de convenție nu se află într-o secțiune profundă, de nivel inferior și testată în detaliu a API-ului la care lucrați, astfel încât toți cei care consumă datele să poată conta pe această reprezentare întreagă și pe toate funcțiile sale auxiliare, atunci se ajunge la o mulțime de oameni care rescriu rutine de bază de manipulare a datelor peste tot.

În general, este mult mai bine să lăsați valoarea într-un context de dată, cum ar fi datetime.date, cât mai mult timp posibil, astfel încât operațiile asupra acesteia să fie exprimate într-un context natural, bazat pe date, și nu în contextul unei modificări personale a unui dezvoltator singuratic într-un număr întreg.

Comentarii

  • oh!, datetime.datetime.now().timestamp() este un float, eu mă așteptam la un șir de caractere (sunt surprins că există suficientă precizie pentru ca acesta să fie comportamentul implicit, frumos!  > Por ThorSummoner.
Chicrala

Cred că am o scurtătură pentru asta:

# Importing datetime.
from datetime import datetime

# Creating a datetime object so we can test.
a = datetime.now()

# Converting a to string in the desired format (YYYYMMDD) using strftime
# and then to int.
a = int(a.strftime('%Y%m%d'))

Comentarii

  • această metodă ține cont de fusul tău orar? Cred că da. cum să o faci universală? –  > Por Akronix.
  • Cred că puteți obține acest lucru așa cum este demonstrat aici, unde se utilizează pytz pentru a obține fusul orar de care ați putea avea nevoie. –  > Por Chicrala.
  • Nu sunt sigur ce ai vrut să spui prin „ține cont de fusul orar”, dar datetime.now() returnează data locală. Puteți folosi datetime.utcnow() dacă doriți data-timp utc. –  > Por Romain Vincent.
Alexandre Crivellaro

Acesta este un exemplu care poate fi folosit, de exemplu, pentru a alimenta o cheie de bază de date, pe care eu o folosesc uneori în loc să folosesc opțiunile AUTOINCREMENT.

import datetime 

dt = datetime.datetime.now()
seq = int(dt.strftime("%Y%m%d%H%M%S"))

Atta Jutt

Atunci când convertiți datetime în numere întregi trebuie să țineți cont de zeci, sute și mii…. cum ar fi „2018-11-03” trebuie să fie ca 20181103 în intfor că trebuie să 2018*10000 + 100* 11 + 3

În mod similar, un alt exemplu, „2018-11-03 10:02:05” trebuie să fie ca 20181103100205 în int.

Cod explicativ

dt = datetime(2018,11,3,10,2,5)
print (dt)

#print (dt.timestamp()) # unix representation ... not useful when converting to int

print (dt.strftime("%Y-%m-%d"))
print (dt.year*10000 + dt.month* 100  + dt.day)
print (int(dt.strftime("%Y%m%d")))

print (dt.strftime("%Y-%m-%d %H:%M:%S"))
print (dt.year*10000000000 + dt.month* 100000000 +dt.day * 1000000 + dt.hour*10000  +  dt.minute*100 + dt.second)
print (int(dt.strftime("%Y%m%d%H%M%S")))

Funcția generală

Pentru a evita această operațiune manuală, utilizați funcția de mai jos

def datetime_to_int(dt):
    return int(dt.strftime("%Y%m%d%H%M%S"))