[PYTHON] "Erreur de type: type de valeur non reconnu: <class'str '>" dans to_datetime des pandas

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.

Forcer pd.to_datetime () à s'exécuter

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.

Corrigez les données avant d'exécuter pd.to_datetime ()

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]

Un moyen simple d'identifier les pièces frauduleuses

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

"Erreur de type: type de valeur non reconnu: <class'str '>" dans to_datetime des pandas
Caractéristiques de pd.NA dans Pandas 1.0.0 (RC0)
Jugement de NaN par les pandas: lorsque le type str et le type float sont mélangés
Résumé des méthodes fréquemment utilisées chez les pandas
L'histoire d'une erreur dans PyOCR
Correspondance à «impossible de coder l’objet: num, de type: <class’ numpy.int64 »>« en erreur Pymongo
Résumé de ce qui a été utilisé dans 100 coups de Pandas (# 1 ~ # 32)
Découvrez la fraction de la valeur saisie en python
pandas Nombre total d'employés Achèvement de la valeur manquante
L'en-tête est mal aligné avec read_csv () et read_table () de Pandas
Rechercher par la valeur de l'instance dans la liste
Erreur de date de l'adresse déjà utilisée dans Flask