2015-10-13 3 views
4

J'essaie de voir si une liste de dates sont des dates valides. J'utilise la bibliothèque dateutil, mais je reçois des résultats bizarres. Par exemple, quand je les opérations suivantes:Python dateutil date conversion

import dateutil.parser as parser 
x = '10/84' 
date = (parser.parse(x)) 
print(date.isoformat()) 

-je obtenir le résultat 1984-10-12T00:00:00 ce qui est faux. Est-ce que quelqu'un sait pourquoi ce 12 a été ajouté à la date?

+0

Pourriez-vous fournir un exemple de code plus détaillé? – farzad

+0

Mise à jour du code que j'essaie. –

Répondre

1

12 est la date du jour. dateutil prend les composants à partir de la date et de l'heure actuelles pour tenir compte de la date ou de l'année manquante dans la date (il ne le fait pas pour le mois, seulement la date ou l'année). Comme un autre exemple serait une date comme - Janauary 20 - cela serait analysé comme 2015/01/12 prenant l'année 2015 à partir de l'heure actuelle.

Malheureusement, je n'ai pas encore trouvé d'options ou d'autres pour arrêter ce comportement. Je crois que la meilleure option pour vous serait de fournir une liste des formats datetime valides que vous attendez, puis essayez manuellement datetime.datetime.strptime sur eux, à l'exception de ValueError. Exemple -

def isdate(dt, fmt): 
    try: 
     datetime.datetime.strptime(dt, fmt) 
     return True 
    except ValueError: 
     return False 

validformats = [...] 
dates =[...] 

for x in dates: 
    if any(isdate(x,fmt) for fmt in validformats): 
     print(x, 'is valid date') 
+0

C'est ce que j'ai fait pour le remplacer aussi. J'espérais qu'il y avait un moyen de contourner cela. Merci –

5

La méthode parse() analyse la chaîne et met à jour un objet par défaut datetime en utilisant les informations analysées. Si le default n'est pas passé dans cette fonction, il utilise la première seconde de today.

Cela signifie que le dans votre résultat est aujourd'hui (lorsque vous exécutez le code), seuls l'année et le mois sont mis à jour à partir de l'analyse de la chaîne.

Si vous avez besoin d'analyser la chaîne de date, mais que vous n'êtes pas sûr de la validité de la valeur, vous pouvez utiliser un bloc try ... except pour intercepter les erreurs d'analyse.

import dateutil.parser as parser 
x = '10/84' 
try: 
    date = (parser.parse(x)) 
    print(date.isoformat()) 
except ValueError as err: 
    pass # handle the error 
+0

Comment puis-je éviter qu'une erreur se produise indiquant que ce n'est pas une date? –

+0

Vous obtenez une erreur lors de l'exécution de cet exemple de code? Si oui, pourriez-vous s'il vous plaît fournir plus d'informations sur l'erreur? – farzad

+0

Non, je ne reçois pas d'erreur. Il se comporte comme vous l'avez dit. si x = '10/84 'je veux lancer une erreur. –