Aujourd'hui, j'ai été positivement surpris par le fait qu'en lisant des données à partir d'un fichier de données (par exemple), pandas est capable de reconnaître des types de valeurs:
df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])
Par exemple, il peut être vérifié de cette manière:
for i, r in df.iterrows():
print type(r['col1']), type(r['col2']), type(r['col3'])
En particulier, les nombres entiers, les flottants et les chaînes ont été reconnus correctement. Cependant, j'ai une colonne qui a des dates dans le format suivant: 2013-6-4
. Ces dates étaient reconnues comme des chaînes (pas comme des objets de date python). Existe-t-il un moyen «d'apprendre» les pandas aux dates reconnues?
df.iterrows()
et de les afficher pour chaque ligne, faitesdf.info()
une seule fois.Réponses:
Vous devriez ajouter
parse_dates=True
, ouparse_dates=['column name']
lors de la lecture, c'est généralement suffisant pour l'analyser par magie. Mais il y a toujours des formats étranges qui doivent être définis manuellement. Dans un tel cas, vous pouvez également ajouter une fonction d'analyseur de date, qui est la manière la plus flexible possible.Supposons que vous ayez une colonne 'datetime' avec votre chaîne, alors:
De cette façon, vous pouvez même combiner plusieurs colonnes dans une seule colonne datetime, cela fusionne une colonne 'date' et une colonne 'time' en une seule colonne 'datetime':
Vous pouvez trouver des directives (c'est-à-dire les lettres à utiliser pour différents formats) pour
strptime
etstrftime
dans cette page .la source
TypeError: strptime() argument 1 must be str, not float
infer_datetime_format
: "pandas tentera de déduire le format des chaînes datetime dans les colonnes". Cela peut être utilisé à la place dedate_parser
.ISO 8601
format, vous ne devriez pas passerinfer_datetime_format
ou une fonction d'analyse syntaxique - c'est beaucoup plus lent que de laisser les pandas le gérer (en particulier ce dernier). Le format de date dans cette réponse appartient également à cette catégoriePeut-être que l'interface pandas a changé depuis la réponse de @Rutger, mais dans la version que j'utilise (0.15.2), la
date_parser
fonction reçoit une liste de dates au lieu d'une seule valeur. Dans ce cas, son code doit être mis à jour comme ceci:la source
La méthode pandas read_csv est idéale pour analyser les dates. Documentation complète sur http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
vous pouvez même avoir les différentes parties de date dans différentes colonnes et passer le paramètre:
La détection par défaut des dates fonctionne très bien, mais elle semble être biaisée vers les formats de date nord-américains. Si vous habitez ailleurs, vous pourriez parfois être surpris par les résultats. Pour autant que je me souvienne, le 1/6/2000 signifie le 6 janvier aux États-Unis par opposition au 1 juin où je vis. Il est assez intelligent de les balancer si des dates comme le 23/6/2000 sont utilisées. Probablement plus sûr de rester avec les variations de date AAAAMMJJ. Toutes mes excuses aux développeurs de pandas, ici mais je ne l'ai pas testé avec des dates locales récemment.
vous pouvez utiliser le paramètre date_parser pour transmettre une fonction de conversion de votre format.
la source
dayfirst
True pour les dates européennes / internationales. pandas.pydata.org/pandas-docs/stable/generated/…Vous pouvez utiliser
pandas.to_datetime()
comme recommandé dans la documentation pourpandas.read_csv()
:Démo:
la source
Lors de la fusion de deux colonnes en une seule colonne datetime, la réponse acceptée génère une erreur (pandas version 0.20.3), car les colonnes sont envoyées à la fonction date_parser séparément.
Les travaux suivants:
la source
Oui - selon la
pandas.read_csv
documentation :Donc, si votre csv a une colonne nommée
datetime
et que les dates ressemblent à,2013-01-01T01:01
par exemple, l'exécuter fera en sorte que les pandas (je suis sur la v0.19.2) prennent automatiquement la date et l'heure:df = pd.read_csv('test.csv', parse_dates=['datetime'])
Notez que vous devez passer explicitement
parse_dates
, cela ne fonctionne pas sans.Vérifier avec:
df.dtypes
Vous devriez voir que le type de données de la colonne est
datetime64[ns]
la source
Si la performance compte pour vous, assurez-vous de chronométrer:
imprime:
Donc, avec la date au format iso8601 (
%Y-%m-%d %H:%M:%S
est apparemment une date au format iso8601, je suppose que le T peut être supprimé et remplacé par un espace), vous ne devriez pas spécifierinfer_datetime_format
(ce qui ne fait pas de différence avec les plus courants non plus apparemment) et en passant le vôtre parser dans juste paralyse les performances. D'un autre côté,date_parser
cela fait une différence avec des formats de jour pas si standard. Assurez-vous de l'heure avant d'optimiser, comme d'habitude.la source
Lors du chargement du fichier csv, il contient une colonne de date.Nous avons deux approches pour que les pandas reconnaissent la colonne de date, c'est-à-dire
Les pandas reconnaissent explicitement le format par arg
date_parser=mydateparser
Les pandas reconnaissent implicitement le format par agr
infer_datetime_format=True
Certaines des données de la colonne de date
01/01/18
01/02/18
Ici, nous ne savons pas les deux premières choses. Cela peut être un mois ou un jour. Donc, dans ce cas, nous devons utiliser la méthode 1: - Passez explicitement le format
Méthode 2: - Reconnaître implicitement ou automatiquement le format
la source