Python pandas convertir datetime pour timestamp efficacement par le biais d'dt accesseur
J'ai un dataframe avec quelques (centaines) de millions de lignes. Et je veux convertir datetime pour timestamp efficacement. Comment puis-je le faire?
Mon exemple df
:
df = pd.DataFrame(index=pd.DatetimeIndex(start=dt.datetime(2016,1,1,0,0,1),
end=dt.datetime(2016,1,2,0,0,1), freq='H'))\
.reset_index().rename(columns={'index':'datetime'})
df.head()
datetime
0 2016-01-01 00:00:01
1 2016-01-01 01:00:01
2 2016-01-01 02:00:01
3 2016-01-01 03:00:01
4 2016-01-01 04:00:01
Maintenant je convertir datetime pour l'horodatage, valeur par valeur, avec .apply()
mais prend un temps très long (quelques heures) si j'ai quelques (centaines) de millions de lignes:
df['ts'] = df[['datetime']].apply(lambda x: x[0].timestamp(), axis=1).astype(int)
df.head()
datetime ts
0 2016-01-01 00:00:01 1451602801
1 2016-01-01 01:00:01 1451606401
2 2016-01-01 02:00:01 1451610001
3 2016-01-01 03:00:01 1451613601
4 2016-01-01 04:00:01 1451617201
Le résultat ci-dessus est ce que je veux.
Si j'essaie d'utiliser le .dt
accesseur de pandas.Series
puis je reçois un message d'erreur:
df['ts'] = df['datetime'].dt.timestamp
AttributeError: 'DatetimeProperties' objet n'a pas d'attribut
'timestamp'
Si je tente de créer, par exemple. les parties de la date de datetimes avec le .dt
accesseur ensuite, il est beaucoup plus rapide ensuite à l'aide de .apply()
:
df['date'] = df['datetime'].dt.date
df.head()
datetime ts date
0 2016-01-01 00:00:01 1451602801 2016-01-01
1 2016-01-01 01:00:01 1451606401 2016-01-01
2 2016-01-01 02:00:01 1451610001 2016-01-01
3 2016-01-01 03:00:01 1451613601 2016-01-01
4 2016-01-01 04:00:01 1451617201 2016-01-01
Je veux quelque chose de similaire avec les horodatages...
Mais je ne comprends pas vraiment la documentation officielle: elle parle de "La conversion d'Horodateurs" mais je ne vois pas du tout horodatage là; simplement, il parle de la conversion de type datetime avec pd.to_datetime()
mais pas de timestamp...
pandas.Timestamp
constructeur aussi ne fonctionne pas (de retour avec l'erreur ci-dessous):
df['ts2'] = pd.Timestamp(df['datetime'])
TypeError: Impossible de convertir les données d'entrée pour l'Horodatage
pandas.De la série.to_timestamp
aussi fait quelque chose de totalement différent que je veux:
df['ts3'] = df['datetime'].to_timestamp
df.head()
datetime ts ts3
0 2016-01-01 00:00:01 1451602801 <bound method Series.to_timestamp of 0 2016...
1 2016-01-01 01:00:01 1451606401 <bound method Series.to_timestamp of 0 2016...
2 2016-01-01 02:00:01 1451610001 <bound method Series.to_timestamp of 0 2016...
3 2016-01-01 03:00:01 1451613601 <bound method Series.to_timestamp of 0 2016...
4 2016-01-01 04:00:01 1451617201 <bound method Series.to_timestamp of 0 2016...
Merci!!!!!
OriginalL'auteur ragesz | 2016-11-30
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez besoin de les convertir d'abord à
numpy array
paret jeté à
int64
- la sortie est enns
, donc le besoin de diviser par10 ** 9
:to_timestamp
est utilisé pour la conversion à partir de la période de datetime index.OriginalL'auteur jezrael
Il y a aussi une autre méthode pour ce faire à l'aide de l'attribut "caché" de
DatetimeIndex
appeléasi8
, ce qui crée un entier timestamp.pd.DatetimeIndex(df.datetime).asi8
Wes McKinney a suggéré dans ce tangentiellement liés stackoverflow question liée ici
OriginalL'auteur BCR
Si vous ne souhaitez pas utiliser numpy vous pouvez utiliser pure pandas conversions
OriginalL'auteur Jozef Cechovsky