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

Rispondere a