web-dev-qa-db-fra.com

Python pandas entier YYYYMMDD à datetime

Je m'excuse d'avance pour cela, mais après deux heures de recherche et d'essais, je ne peux pas obtenir la bonne réponse ici. J'ai une trame de données, remplie via pandas io sql.read_frame (). La colonne qui s'avère trop pour moi est de dtypeint64 . Les entiers sont au format YYYYMMDD. Par exemple 20070530 - 30 mai 2007. J'ai essayé une gamme d'approches, la plus évidente étant;

pd.to_datetime(dt['Date']) et pd.to_datetime(str(dt['Date']))

avec de multiples variations sur les fonctions différents paramètres.

Le résultat a été, au mieux, que la date interprétée comme étant l'heure. La date est définie sur 1970-01-01 - résultat selon l'exemple ci-dessus 1970-01-01 00:00:00.020070530

J'ai également essayé diverses fonctions .map() trouvées dans des publications simulaires.

J'ai remarqué que selon np.date_range() peut interpréter les valeurs de chaîne du format YYYYMMDD, mais c'est le plus près que je suis venu de voir une solution.

Si quelqu'un a une réponse, je serais très reconnaissant!

EDIT: Au vu de la réponse d'Ed Chum, le problème est probablement lié à l'encodage. rep() sur un sous-ensemble de dataFrame donne:

OrdNo LstInvDt\n0
9 20070620\n1
11 20070830\n2
19 20070719\n3
21 20070719\n4
23 20070719\n5
26 20070911\n7
29 20070918\n8
31 0070816\n9
34 20070925\n10

C'est lorsque LstInvDt est dtype int64.

22
Rookie

to_datetime accepte une chaîne de format:

In [92]:

t = 20070530
pd.to_datetime(str(t), format='%Y%m%d')
Out[92]:
Timestamp('2007-05-30 00:00:00')

exemple:

In [94]:

t = 20070530
df = pd.DataFrame({'date':[t]*10})
df
Out[94]:
       date
0  20070530
1  20070530
2  20070530
3  20070530
4  20070530
5  20070530
6  20070530
7  20070530
8  20070530
9  20070530
In [98]:

df['DateTime'] = df['date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d'))
df
Out[98]:
       date   DateTime
0  20070530 2007-05-30
1  20070530 2007-05-30
2  20070530 2007-05-30
3  20070530 2007-05-30
4  20070530 2007-05-30
5  20070530 2007-05-30
6  20070530 2007-05-30
7  20070530 2007-05-30
8  20070530 2007-05-30
9  20070530 2007-05-30
In [99]:

df.dtypes
Out[99]:
date                 int64
DateTime    datetime64[ns]
dtype: object

[~ # ~] modifier [~ # ~]

En fait, il est plus rapide de convertir le type en chaîne, puis de convertir la série entière en un datetime plutôt que d'appeler apply sur chaque valeur:

In [102]:

df['DateTime'] = pd.to_datetime(df['date'].astype(str), format='%Y%m%d')
df
Out[102]:
       date   DateTime
0  20070530 2007-05-30
1  20070530 2007-05-30
2  20070530 2007-05-30
3  20070530 2007-05-30
4  20070530 2007-05-30
5  20070530 2007-05-30
6  20070530 2007-05-30
7  20070530 2007-05-30
8  20070530 2007-05-30
9  20070530 2007-05-30

timings

In [104]:

%timeit df['date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d'))

100 loops, best of 3: 2.55 ms per loop
In [105]:

%timeit pd.to_datetime(df['date'].astype(str), format='%Y%m%d')
1000 loops, best of 3: 396 µs per loop
42
EdChum