224 votes

Convertir le temps unix en date lisible dans un dataframe pandas

J'ai un dataframe avec des temps et des prix unix. Je veux convertir la colonne index pour qu'elle affiche des dates lisibles par l'homme.

Par exemple, j'ai date comme 1349633705 dans la colonne d'index mais je voudrais qu'il apparaisse comme 10/07/2012 (ou au moins 10/07/2012 18:15 ).

Voici le code avec lequel je travaille et ce que j'ai déjà essayé :

import json
import urllib2
from datetime import datetime
response = urllib2.urlopen('http://blockchain.info/charts/market-price?&format=json')
data = json.load(response)   
df = DataFrame(data['values'])
df.columns = ["date","price"]
#convert dates 
df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))
df.index = df.date   

Comme vous pouvez le voir, j'utilise df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d")) ce qui ne fonctionne pas puisque je travaille avec des entiers et non des chaînes de caractères. Je pense que je dois utiliser datetime.date.fromtimestamp mais je ne suis pas sûr de savoir comment l'appliquer à l'ensemble de l'Union européenne. df.date .

Merci.

391voto

Jeff Points 27612

Il s'agit de secondes depuis l'époque.

In [20]: df = DataFrame(data['values'])

In [21]: df.columns = ["date","price"]

In [22]: df
Out[22]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 358 entries, 0 to 357
Data columns (total 2 columns):
date     358  non-null values
price    358  non-null values
dtypes: float64(1), int64(1)

In [23]: df.head()
Out[23]: 
         date  price
0  1349720105  12.08
1  1349806505  12.35
2  1349892905  12.15
3  1349979305  12.19
4  1350065705  12.15
In [25]: df['date'] = pd.to_datetime(df['date'],unit='s')

In [26]: df.head()
Out[26]: 
                 date  price
0 2012-10-08 18:15:05  12.08
1 2012-10-09 18:15:05  12.35
2 2012-10-10 18:15:05  12.15
3 2012-10-11 18:15:05  12.19
4 2012-10-12 18:15:05  12.15

In [27]: df.dtypes
Out[27]: 
date     datetime64[ns]
price           float64
dtype: object

113voto

Sandesh Points 347

Si vous essayez d'utiliser :

df[DATE_FIELD]=(pd.to_datetime(df[DATE_FIELD],***unit='s'***))

et reçoit une erreur :

"pandas.tslib.OutOfBoundsDatetime : impossible de convertir l'entrée avec l'unité 's'"

Cela signifie que le DATE_FIELD n'est pas spécifié en secondes.

Dans mon cas, il s'agissait de milli secondes - EPOCH time .

La conversion a fonctionné comme suit :

df[DATE_FIELD]=(pd.to_datetime(df[DATE_FIELD],unit='ms'))

44voto

fahim reza Points 149

En supposant que nous ayons importé pandas as pd y df est notre cadre de données

pd.to_datetime(df['date'], unit='s')

fonctionne pour moi.

20voto

Carlos Ferreira Points 734

La documentation Pandas donne cet exemple et d'autres exemples de format et n'a pas été incluse dans les réponses précédentes. Lien : https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html

Code

pd.to_datetime(1490195805, unit='s')

Timestamp('2017-03-22 15:16:45')

pd.to_datetime(1490195805433502912, unit='ns')

Timestamp('2017-03-22 15:16:45.433502912')

2voto

ipramusinto Points 1692

Il est également possible de modifier une ligne du code ci-dessus :

# df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))
df.date = df.date.apply(lambda d: datetime.datetime.fromtimestamp(int(d)).strftime('%Y-%m-%d'))

Il devrait également fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X