web-dev-qa-db-fra.com

types de date et heure dans pandas read_csv

Je lis dans un fichier csv avec plusieurs colonnes datetime. J'aurais besoin de définir les types de données lors de la lecture dans le fichier, mais les dates semblent être un problème. Par exemple:

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = ['datetime', 'datetime', 'str', 'float']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Quand exécuté donne une erreur:

TypeError: le type de données "datetime" n'est pas compris

La conversion de colonnes après le fait, via pandas.to_datetime () n'est pas une option. Je ne sais pas quelles colonnes seront des objets datetime. Ces informations peuvent changer et proviennent de tout ce qui informe ma liste de types.

Alternativement, j'ai essayé de charger le fichier csv avec numpy.genfromtxt, de définir les types dans cette fonction, puis de les convertir en pandas.dataframe, mais les données sont corrompues. Toute aide est grandement appréciée!

92
user3221055

Pourquoi ça ne marche pas

Il n'est pas nécessaire de définir un type de date et heure pour read_csv car les fichiers csv ne peuvent contenir que des chaînes, des entiers et des flottants.

Si vous définissez un type sur datetime, pandas interprétera le datetime comme un objet, ce qui signifie que vous obtiendrez une chaîne.

Façon de résoudre ce problème avec les pandas

La fonction pandas.read_csv() a un argument de mot clé appelé parse_dates

En utilisant cela, vous pouvez à la volée convertir des chaînes, des flottants ou des entiers en dates-heures en utilisant le paramètre par défaut date_parser (dateutil.parser.parser)

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = {'col1': 'str', 'col2': 'str', 'col3': 'str', 'col4': 'float'}
parse_dates = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)

Ceci fera que pandas lira col1 et col2 comme des chaînes, qu’il s’agira très probablement ("2016-05-05", etc.) et, après avoir lu la chaîne, date_parser pour chaque colonne agira sur cette chaîne et restituera tout ce que la fonction retourne.

Définir votre propre fonction d'analyse de date:

La fonction pandas.read_csv() possède également un argument de mot clé appelé date_parser

Si vous définissez cette fonction sur une fonction lambda, cette fonction particulière sera utilisée pour l'analyse des dates.

GOTCHA AVERTISSEMENT

Vous devez lui donner la fonction, pas l'exécution de la fonction, donc c'est Correct

date_parser = pd.datetools.to_datetime

Ceci est incorrect :

date_parser = pd.datetools.to_datetime()

Pandas 0.22 Mise à jour

pd.datetools.to_datetime a été déplacé vers date_parser = pd.to_datetime

Merci @stackoverYC

222
firelynx

Vous pouvez essayer de passer des types réels au lieu de chaînes.

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Mais ce sera très difficile à diagnostiquer sans vos données à bricoler.

Et vraiment, vous voulez probablement que pandas analyse les dates dans TimeStamps, ce qui pourrait être:

pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)
14
Paul H

Il existe maintenant un paramètre parse_dates que vous pouvez transmettre à read_csv qui vous permet de répertorier les noms des colonnes à traiter comme des dates. La meilleure façon de procéder pour OP est donc:

dateCols = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=dateCols)

documentation actuelle de read_csv plutôt élégant ...

13
mrjrdnthms

J'ai essayé d'utiliser l'option dtypes = [date/heure, ...], mais

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

J'ai rencontré l'erreur suivante:

TypeError: data type not understood

Le seul changement que j'ai dû faire est de remplacer datetime par datetime.datetime

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime.datetime, datetime.datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)
6
Jose Buraschi