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 dtype
int64
. 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.
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