J'ai une énorme trame de données avec de nombreuses colonnes, dont beaucoup sont de type datetime.datetime
. Le problème est que beaucoup ont également des types mixtes, y compris par exemple des datetime.datetime
valeurs et des None
valeurs (et potentiellement d'autres valeurs invalides):
0 2017-07-06 00:00:00
1 2018-02-27 21:30:05
2 2017-04-12 00:00:00
3 2017-05-21 22:05:00
4 2018-01-22 00:00:00
...
352867 2019-10-04 00:00:00
352868 None
352869 some_string
Name: colx, Length: 352872, dtype: object
D'où une object
colonne de type. Cela peut être résolu avec df.colx.fillna(pd.NaT)
. Le problème est que la trame de données est trop grande pour rechercher des colonnes individuelles.
Une autre approche consiste à utiliser pd.to_datetime(col, errors='coerce')
, mais cela transtypera à de datetime
nombreuses colonnes qui contiennent des valeurs numériques.
Je pourrais aussi le faire df.fillna(float('nan'), inplace=True)
, même si les colonnes contenant les dates sont toujours de object
type et auraient toujours le même problème.
Quelle approche pourrais-je suivre pour convertir en datetime les colonnes dont les valeurs contiennent vraiment des datetime
valeurs, mais pourraient également contenir None
, et potentiellement des valeurs invalides (en mentionnant qu'autrement une clause pd.to_datetime
dans une try
/ except
ferait)? Quelque chose comme une version flexible depd.to_datetime(col)
datetime.datetime
oupandas._libs.tslibs.timestamps.Timestamp
? Si l'ancien ma recommandation serait de changer tout ce qui a créé le datetime au type quipandas
gère un peu mieux.None
dans vos colonnes, desNone
représentants réels ou des chaînes de caractères?None
pas des ficelles. Potentiellement , il peut y avoir de mauvaises valeurs aussi ... @erfandatetime
etvalues
en elle?Réponses:
Le principal problème que je vois est lors de l'analyse des valeurs numériques.
Je proposerais d'abord de les convertir en chaînes
Installer
Solution
la source
pd.to_datetime
etcoerce
les erreurs, car il y en a beaucoup. Le problème était avec les colonnes numériques. Mais il ne m'est pas venu à l'esprit que les colonnes numériques converties en chaîne ne sont pas analysées par les pandasto_datetime
. Merci beaucoup, cela aide vraiment!Cette fonction définira le type de données d'une colonne sur datetime, si une valeur de la colonne correspond au modèle d'expression régulière (\ d {4} - \ d {2} - \ d {2}) + (par exemple 2019-01-01 ). Merci à cette réponse sur la façon de rechercher une chaîne dans toutes les colonnes Pandas DataFrame et de filtrer qui a aidé à définir et à appliquer le masque.
En partant de la suggestion d'utilisation
dateutil
, cela peut vous aider. Il fonctionne toujours sur la présomption que s'il y a des valeurs de type date dans une colonne, que la colonne doit être un datetime. J'ai essayé de considérer différentes méthodes d'itérations de trame de données qui sont plus rapides. Je pense que cette réponse sur Comment itérer sur les lignes d'un DataFrame dans Pandas a fait un bon travail pour les décrire.Notez que
dateutil.parser
le jour ou l'année en cours sera utilisé pour toutes les chaînes telles que «décembre» ou «novembre 2019» sans valeur d'année ou de jour.Dans le cas où vous souhaitez également utiliser les valeurs de datatime de
dateutil.parser
, vous pouvez ajouter ceci:la source
dateutil
module mentionné par @Serge semble être utile.dateutil.parse
d'identifier de nombreux types de chaînes de dates.