web-dev-qa-db-fra.com

to_datetime Valeur Erreur: au moins [année, mois, jour] doit être spécifié Pandas

Je lis de deux CSV différents ayant chacun des valeurs de date dans leurs colonnes. Après read_csv, je souhaite convertir les données en date-heure avec la méthode to_datetime. Les formats des dates dans chaque fichier CSV sont légèrement différents et, bien que les différences soient notées et spécifiées dans l'argument de format to_datetime, l'un est converti correctement et l'autre renvoie l'erreur de valeur suivante.

ValueError: to assemble mappings requires at least that [year, month, day] be sp
ecified: [day,month,year] is missing

premier dte.head ()

0  10/14/2016  10/17/2016  10/19/2016    8/9/2016  10/17/2016   7/20/2016
1   7/15/2016   7/18/2016   7/20/2016    6/7/2016   7/18/2016   4/19/2016
2   4/15/2016   4/14/2016   4/18/2016   3/15/2016   4/18/2016   1/14/2016
3   1/15/2016   1/19/2016   1/19/2016  10/19/2015   1/19/2016  10/13/2015
4  10/15/2015  10/14/2015  10/19/2015   7/23/2015  10/14/2015   7/15/2015

ce dataframe convertit bien en utilisant le code suivant:

dte = pd.to_datetime(dte, infer_datetime_format=True)

ou 

dte = pd.to_datetime(dte[x], format='%m/%d/%Y')

le deuxième dtd.head ()

0   2004-01-02 2004-01-02  2004-01-09 2004-01-16  2004-01-23  2004-01-30
1   2004-01-05 2004-01-09  2004-01-16 2004-01-23  2004-01-30  2004-02-06
2   2004-01-06 2004-01-09  2004-01-16 2004-01-23  2004-01-30  2004-02-06
3   2004-01-07 2004-01-09  2004-01-16 2004-01-23  2004-01-30  2004-02-06
4   2004-01-08 2004-01-09  2004-01-16 2004-01-23  2004-01-30  2004-02-06

ce csv ne convertit pas en utilisant soit: 

dtd = pd.to_datetime(dtd, infer_datetime_format=True)

ou 

dtd = pd.to_datetime(dtd, format='%Y-%m-%d')

Il retourne l'erreur de valeur ci-dessus. Fait intéressant, cependant, utiliser les méthodes parse_dates et infer_datetime_format comme arguments de la méthode read_csv fonctionne sans problème. Qu'est-ce qui se passe ici? 

10
Jed

Vous pouvez stackpd.to_datetime/unstack

pd.to_datetime(dte.stack()).unstack()

 enter image description here

_/explication
pd.to_datetime fonctionne sur une chaîne, une liste ou pd.Series. dte est un pd.DataFrame et est la raison pour laquelle vous rencontrez des problèmes. dte.stack() génère un pd.Series dans lequel toutes les lignes sont empilées les unes sur les autres. Cependant, sous cette forme empilée, étant donné que c'est un pd.Series, je peux obtenir un pd.to_datetime vectorisé pour le travailler. la unstack suivante inverse simplement la stack initiale pour obtenir la forme originale de dte

8
piRSquared

Pour moi, fonctionne apply function to_datetime :

print (dtd)
            1           2           3           4           5           6
0                                                                        
0  2004-01-02  2004-01-02  2004-01-09  2004-01-16  2004-01-23  2004-01-30
1  2004-01-05  2004-01-09  2004-01-16  2004-01-23  2004-01-30  2004-02-06
2  2004-01-06  2004-01-09  2004-01-16  2004-01-23  2004-01-30  2004-02-06
3  2004-01-07  2004-01-09  2004-01-16  2004-01-23  2004-01-30  2004-02-06
4  2004-01-08  2004-01-09  2004-01-16  2004-01-23  2004-01-30  2004-02-06


dtd = dtd.apply(pd.to_datetime)

print (dtd)
           1          2          3          4          5          6
0                                                                  
0 2004-01-02 2004-01-02 2004-01-09 2004-01-16 2004-01-23 2004-01-30
1 2004-01-05 2004-01-09 2004-01-16 2004-01-23 2004-01-30 2004-02-06
2 2004-01-06 2004-01-09 2004-01-16 2004-01-23 2004-01-30 2004-02-06
3 2004-01-07 2004-01-09 2004-01-16 2004-01-23 2004-01-30 2004-02-06
4 2004-01-08 2004-01-09 2004-01-16 2004-01-23 2004-01-30 2004-02-06
5
jezrael

Ça marche pour moi:

dtd.apply(lambda x: pd.to_datetime(x,errors = 'coerce', format = '%Y-%m-%d'))

De cette façon, vous pouvez utiliser les attributs de fonction comme ci-dessus (erreurs et format). Voir plus https://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_datetime.html