Cette erreur se produit lorsqu'une chaîne de caractères qui ne peut pas être reconnue comme une date est incluse. J'en suis accro, alors je l'ai résumé dans l'article.
Lors de la création d'un DataFrame, s'il existe une "valeur non date" entre les chaînes de date, elle sera lue comme un objet. (Si tous sont composés de chaînes qui peuvent être interprétées comme des dates, elles peuvent être lues comme datetime.)
Par exemple, un trait d'union (-) est inséré entre les dates comme cas courant dans les données réelles.
temp = pd.DataFrame(["2020-04-09", "2020-04-10", "-", "2020-04-12"], columns=["date"])
date | |
---|---|
0 | 2020-04-09 |
1 | 2020-04-10 |
2 | - |
3 | 2020-04-12 |
À ce stade, une erreur se produit si la conversion en type datetime est effectuée.
pd.to_datetime(temp.date)
#Sortie d'erreur
TypeError: Unrecognized value type: <class 'str'>
Les contre-mesures sont les suivantes.
Ignorez l'erreur de conversion et exécutez. A ce moment-là, la partie de conversion NG sera "NaT".
pd.to_datetime(temp.date, errors="coerce")
#Résultat de la conversion
0 2020-04-09
1 2020-04-10
2 NaT
3 2020-04-12
Name: date, dtype: datetime64[ns]
Je pense que ce n'est pas grave si vous comprenez à l'avance que les tirets sont inclus et ignorés comme cette fois. Cependant, je ne suis pas sûr, mais j'ai eu une erreur, il vaut peut-être mieux éviter de l'utiliser.
Remplacez ou supprimez correctement à l'avance les chaînes inutiles. Vous pouvez également agir au niveau du fichier de données ou de la base de données.
Par exemple, remplacez le trait d'union par un caractère vide, puis exécutez. (Dans le cas de caractères vides, pd.to_datetime () peut terminer l'exécution sans sauter une exception.) Similaire à l'exécution forcée ci-dessus, la partie de conversion NG sera "NaT".
temp.date = temp.date.replace({"-":""})
pd.to_datetime(temp.date)
#Résultat de la conversion
0 2020-04-09
1 2020-04-10
2 NaT
3 2020-04-12
Name: date, dtype: datetime64[ns]
Dans l'exemple ci-dessus, il est facile de voir que les traits d'union sont mélangés en raison de la petite quantité de données, mais il devient difficile à saisir lorsque la quantité de données est grande. Par exemple, vous pouvez facilement vérifier les caractères illégaux avec le code ci-dessous. Une exception est déclenchée au premier emplacement incorrect. Pour tout vérifier, c'est une image de répétition du contrôle en corrigeant à chaque fois la partie bloquée. (Veuillez noter que s'il y a trop de variantes de fraude, cela peut être une tâche énorme.)
def check(x):
print(x)
pd.to_datetime(x)
temp.date.map(check)
c'est tout.
Recommended Posts