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?
Vous pouvez stack
pd.to_datetime
/unstack
pd.to_datetime(dte.stack()).unstack()
_/explicationpd.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
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
Ç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