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
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python