Problème avec des dates antérieures à 1900...

Le
Emaging
Bonjour,

J'ai une erreur lorsque j'essaye de mettre en forme des dates
antérieures à 1900 :

$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> dt_naissance = time.strptime('18960604', "%Y%m%d")
>>> str_naissance = time.strftime("'%Y-%m-%d %H:%M:%S'", dt_naissance)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: year out of range

Auriez-vous une idée sur la façon de contourner ce problème ?
D'avance merci.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
William Dode
Le #19908701
On 10-08-2009, Emaging wrote:
Bonjour,

J'ai une erreur lorsque j'essaye de mettre en forme des dates
antérieures à 1900 :

$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import time
dt_naissance = time.strptime('18960604', "%Y%m%d")
str_naissance = time.strftime("'%Y-%m-%d %H:%M:%S'", dt_naissance)






Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: year out of range

Auriez-vous une idée sur la façon de contourner ce problème ?
D'avance merci.



Il faut utiliser le module datetime
http://docs.python.org/library/datetime.html

Et si tu as des trucs un peu plus tordus à faire avec les dates y a le
module externe dateutil : http://labix.org/python-dateutil

bye

--
William Dodé - http://flibuste.net
Informaticien Indépendant
Emaging
Le #19908791
On 10 août, 12:32, William Dode
Il faut utiliser le module datetimehttp://docs.python.org/library/datetim e.html


Ce n'est pas une mauvaise idée, mais comment ?

Mes essais me donnent un résultat qui n'est pas bien meilleur :

str_naissance = datetime.date.strftime("'%Y-%m-%d %H:%M:%S'", datetim e.datetime.strptime('18960604', "%Y%m%d"))






Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor 'strftime' requires a 'datetime.date' object but
received a 'str'

Et si tu as des trucs un peu plus tordus à faire avec les dates y a le
module externe dateutil :http://labix.org/python-dateutil



Transfomer une date AAAAMMJJ en AAAA-MM-JJ hh:mm:ss ne me semble pas
si tordu qua ça si ?
Bruno Desthuilliers
Le #19909321
Emaging a écrit :
Bonjour,

J'ai une erreur lorsque j'essaye de mettre en forme des dates
antérieures à 1900 :

$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import time
dt_naissance = time.strptime('18960604', "%Y%m%d")
str_naissance = time.strftime("'%Y-%m-%d %H:%M:%S'", dt_naissance)






Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: year out of range

Auriez-vous une idée sur la façon de contourner ce problème ?



Même pb avec datetime.datetime, hélas. Cette limitation ne semble pas
documenté dans le module time, je n'ai pas épluché la doc de datetime
mais le message d'erreur était un poil plus explicite (sur le fait qu'il
s'agisse bien d'une limitation).

Ceci étant, dans ton cas, c'est assez simple de faire ça "à la mano":

date_YMD = '18960604'
print "%s-%s-%s 00:00:00" % (date_YMD[:4], date_YMD[4:6], date_YMD[6:])
Bruno Desthuilliers
Le #19909421
Emaging a écrit :
On 10 août, 12:32, William Dode
Il faut utiliser le module datetimehttp://docs.python.org/library/datetime.html


Ce n'est pas une mauvaise idée, mais comment ?

Mes essais me donnent un résultat qui n'est pas bien meilleur :

str_naissance = datetime.date.strftime("'%Y-%m-%d %H:%M:%S'", datetime.datetime.strptime('18960604', "%Y%m%d"))






Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor 'strftime' requires a 'datetime.date' object but
received a 'str'



Si tu lisais la doc de datetime ?-)

Mais bon, ça ne solutionnera pas ton problème, hélas (cf mon autre post
dans ce thread).


Et si tu as des trucs un peu plus tordus à faire avec les dates y a le
module externe dateutil :http://labix.org/python-dateutil



Transfomer une date AAAAMMJJ en AAAA-MM-JJ hh:mm:ss ne me semble pas
si tordu qua ça si ?



Ce que tu veux transformer n'est pas une date mais une chaine.
Emaging
Le #19909601
On 10 août, 14:48, Bruno Desthuilliers <bruno.
wrote:
Si tu lisais la doc de datetime ?-)


Tu penses bien que je ne me serais pas permis... ( rtfm :-)

Je t'accorde que mon deuxième post (copier/coller un peu rapide)
n'était pas correct, il fallait lire :
dt_naissance = datetime.datetime.strptime('18960604', "%Y%m%d")
str_naissance = datetime.datetime.strftime(dt_naissance, "'%Y-%m-%d % H:%M:%S'")






Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: year96 is before 1900; the datetime strftime() methods
require year >= 1900

C'est parce qu'il y a inversion des paramètres entre le module time et
datetime (format, date) -> (date, format)
(trop classe, ça aussi !)

Bon, il semblerait bien que ce soit la fonction strftime (C lib) qui
merde et que la seule solution soit effectivement de l'oublier...

Ce que tu veux transformer n'est pas une date mais une chaine.



En fait, dans mon traitement, c'est bien une date dont j'ai besoin
(pour pouvoir calculer l'age entre autres).
La soluce, que j'ai trouvé, c'est pas top, mais au moins ça passe :

dt_naissance = datetime.datetime.strptime('18960604', "%Y%m%d")
str_naissance = "%.4d-%.2d-%.2d %.2d:%.2d:%.2d" % (dt_naissance.year, dt_naissance.month, dt_naissance.day, dt_naissance.hour, dt_naissance.minu te, dt_naissance.second)
print str_naissance






1896-06-04 00:00:00

Merci de vos réponses.
--
Ivan
Bruno Desthuilliers
Le #19909801
Emaging a écrit :
On 10 août, 14:48, Bruno Desthuilliers <bruno.
wrote:
Si tu lisais la doc de datetime ?-)


Tu penses bien que je ne me serais pas permis... ( rtfm :-)



Ca m'aurait étonné, aussi !-)

Je t'accorde que mon deuxième post (copier/coller un peu rapide)
n'était pas correct, il fallait lire :
dt_naissance = datetime.datetime.strptime('18960604', "%Y%m%d")
str_naissance = datetime.datetime.strftime(dt_naissance, "'%Y-%m-%d %H:%M:%S'")









Pourquoi pas plus simplement:
str_naissance = dt_naissance.strftime("'%Y-%m-%d %H:%M:%S'")

datetime.strptime retourn un objet datetime, pas un simple struct /
tuple / whatever.


ceci étant, vu que datetime.strftime s'appuie sur strfime, le résultat à
ce stade est le même:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: year96 is before 1900; the datetime strftime() methods
require year >= 1900

C'est parce qu'il y a inversion des paramètres entre le module time et
datetime (format, date) -> (date, format)
(trop classe, ça aussi !)



C'est parce que datetime.strftime est une méthode, pas une function. le
premier argument d'une méthode est toujours l'instance sur laquelle on
l'appelle - mais quand l'appel est fait normalement (c'est à dire sur
l'instance), c'est python qui se charge d'insérer l'instance comme
premier argument (nb: raccourci très raccourci d'un mécanisme plus
complexe, mais à ce stade ça suffit comme explication - si t'en veux
plus, tu me paie l'apéro !-)).

Bon, il semblerait bien que ce soit la fonction strftime (C lib) qui
merde et que la seule solution soit effectivement de l'oublier...

Ce que tu veux transformer n'est pas une date mais une chaine.



En fait, dans mon traitement, c'est bien une date dont j'ai besoin
(pour pouvoir calculer l'age entre autres).



Alors lis *vraiment* la doc du module datetime. C'est précisément à ça
que servent les objets date et datetime.

La soluce, que j'ai trouvé, c'est pas top, mais au moins ça passe :

dt_naissance = datetime.datetime.strptime('18960604', "%Y%m%d")
str_naissance = "%.4d-%.2d-%.2d %.2d:%.2d:%.2d" % (dt_naissance.year, dt_naissance.month, dt_naissance.day, dt_naissance.hour, dt_naissance.minute, dt_naissance.second)
print str_naissance






1896-06-04 00:00:00



Et il est où, ton calcul, mon grand ?-)

Bon, pour ce qui est du formatage, effectivement, c'est pas top. Regarde
peut-être dateutils, sinon - puisque tu aura besoin de l'objet datetime
pour les calculs, t'a plus qu'à garder sous le coude ta fonction de
formattage (en plus datetime est codé en C et de telle façon qu'on ne
puisse pas le monkeypatcher).
Publicité
Poster une réponse
Anonyme