Spécifiant le format de la date lors de la conversion avec pandas.to datetime

j'ai des données dans un fichier csv avec les dates stockées comme des chaînes de caractères dans une norme royaume-UNI, format - %d/%m/%Y - ce qui signifie qu'ils ressemblent à:

12/01/2012
30/01/2012

les exemples ci-dessus représentent le 12 janvier 2012 et le 30 janvier 2012.

quand j'importe ces données avec pandas version 0.11.0 j'ai appliqué la transformation suivante:

import pandas as pd
...
cpts.Date = cpts.Date.apply(pd.to_datetime)

mais il convertit les dates de façon incohérente. Pour utiliser mon exemple existant, 12/01/2012 convertirait comme un objet datetime représentant le 1 décembre 2012 mais 30/01/2012 convertit en 30 janvier 2012, qui est ce que je veux.

d'Après cette question j'ai essayé:

cpts.Date = cpts.Date.apply(pd.to_datetime, format='%d/%m/%Y')

mais les résultats sont exactement les mêmes. code source suggère que je fais les choses correctement donc je suis perdu. Personne ne sait ce que je fais mal?

18
demandé sur Community 2013-05-21 18:12:21

2 réponses

Vous pouvez utiliser le parse_dates option read_csv pour effectuer la conversion directement en lisant vos données.

L'astuce ici est d'utiliser dayfirst=True pour indiquer que vos dates commencent avec le jour et non avec le mois. Voir ici pour plus d'informations: http://pandas.pydata.org/pandas-docs/dev/generated/pandas.io.parsers.read_csv.html

Quand vos dates d'avoir à faire l'index:

>>> import pandas as pd
>>> from StringIO import StringIO
>>> s = StringIO("""date,value
... 12/01/2012,1
... 12/01/2012,2
... 30/01/2012,3""")
>>> 
>>> pd.read_csv(s, index_col=0, parse_dates=True, dayfirst=True)
            value
date             
2012-01-12      1
2012-01-12      2
2012-01-30      3

ou quand vos dates sont juste dans un certain colonne:

>>> s = StringIO("""date
... 12/01/2012
... 12/01/2012
... 30/01/2012""")
>>> 
>>> pd.read_csv(s, parse_dates=[0], dayfirst=True)
                 date
0 2012-01-12 00:00:00
1 2012-01-12 00:00:00
2 2012-01-30 00:00:00
16
répondu joris 2013-05-21 14:31:23

je crois que vous appelez ça correctement, et j'ai posté ce que une question sur github.

Vous pouvez simplement spécifier le format to_datetime directement, par exemple:

In [1]: s = pd.Series(['12/1/2012', '30/01/2012'])

In [2]: pd.to_datetime(s, format='%d/%m/%Y')
Out[2]:
0   2012-01-12 00:00:00
1   2012-01-30 00:00:00
dtype: datetime64[ns]

mise à jour: comme OP le souligne correctement, cela ne fonctionne pas avec NaN, si vous êtes satisfait de dayfirst=True (qui fonctionne avec NaN aussi):

s.apply(pd.to_datetime, dayfirst=True)

à noter qu'il faut faire attention en utilisant dayfirst (ce qui est plus facile que de spécifier le format exact), depuis dayfirst n'est pas stricte.

9
répondu Andy Hayden 2013-05-21 19:55:10