web-dev-qa-db-fra.com

Convertir le temps unix en date lisible en pandas dataframe

J'ai une base de données avec des temps et des prix unix. Je veux convertir la colonne d'index afin qu'elle apparaisse en dates lisibles par l'homme.

Ainsi, par exemple, j’ai date sous la forme 1349633705 Dans la colonne d’index, mais j’aimerais qu’il soit affiché sous la forme 10/07/2012 (Ou au moins 10/07/2012 18:15).

Pour certains contextes, voici le code sur 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")) ici, ce qui ne fonctionne pas car je travaille avec des entiers et non des chaînes. Je pense que je dois utiliser datetime.date.fromtimestamp Mais je ne sais pas trop comment appliquer cela à l'ensemble de df.date.

Merci.

83
W A Carnegie

Celles-ci semblent être secondes depuis Epoch.

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
171
Jeff

Si vous essayez d'utiliser:

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

et recevez une erreur:

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

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

Dans mon cas, c’était millisecondes - Epoch time.

La conversion a fonctionné en utilisant ci-dessous:

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

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

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

travaille pour moi.

9
fahim reza

Alternativement, en changeant 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'))

Cela devrait aussi marcher.

0
bakka