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.
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
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'))
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.
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.