[Python] Gestione delle date
Daniele Varrazzo
piro a develer.com
Mer 15 Ott 2014 16:12:12 CEST
On 2014-10-15 14:26, Riccardo Brazzale wrote:
> Ciao a tutti,
>
> mi trovo a dover gestire una data, proveniente da un db mysql, nel
> formato
> windows seriale.
>
> Come esempio trovo che:
>
> 39690 = 30/08/08
> 40849 = 02/11/11
>
> ora:
>
> Python 2.7.6 (default, Mar 22 2014, 22:59:56)
> [GCC 4.8.2] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>>>> from datetime import datetime
>>>> dt = datetime.fromordinal(39690)
>>>> datetime.isoformat(dt)
> '0109-09-01T00:00:00'
>>>> dt = datetime.fromordinal(40849)
>>>> datetime.isoformat(dt)
> '0112-11-03T00:00:00'
>>>>
>
>
> Qualcosa non mi torna perché evidentemente canno la gestione.
>
> Qual è il procedimento corretto?
Aggiungi seicentonovantatremilacinquecentonovantaquattro giorni.
La "data seriale" di windows evidentemente usa uno zero diverso da
quello di Python:
>>> import datetime
>>> datetime.date(2008,8,30).toordinal()
733284
Puoi verificare che le due epoche, quella di Python e quella di Windows
sono costanti, partendo dai tuoi due esempi:
>>> datetime.date(2008,8,30).toordinal() - 39690
693594
>>> datetime.date(2011,11,2).toordinal() - 40849
693594
Quindi basta aggiungere questo offset:
>>> def date_from_winserial(n):
... return datetime.date.fromordinal(n + 693594)
>>> date_from_winserial(39690)
datetime.date(2008, 8, 30)
>>> date_from_winserial(40849)
datetime.date(2011, 11, 2)
Curiosita': quale zero usa windows?
>>> date_from_winserial(0)
datetime.date(1899, 12, 30)
E che data e'? Con questa data credo che 1 corrisponda al 1/1/1900 se si
include il bug di considerare il 1900 come un anno bisestile (che
semplifica l'algoritmo di ricerca degli anni bisestili a "anno & 3 == 0"
e funziona bene dal 1901 al 2099). Le date dal 1/1 al 27/2/1900 sono
sbagliate ma le altre vanno bene, che e' un'approssimazione sufficiente
per gli standard pragmatici di Microsoft e le ristrettezze dell'hardware
per cui le prime versioni di Excel erano scritte. Archeologia
informatica...
-- Daniele
Maggiori informazioni sulla lista
Python