Convierta la hora de Unix en una fecha legible en el marco de datos de pandas
Tengo un marco de datos con tiempos y precios de Unix. Quiero convertir la columna de índice para que se muestre en fechas legibles por humanos.
Entonces, por ejemplo, tengo date
como 1349633705
en la columna de índice pero me gustaría que se mostrara como 10/07/2012
(o al menos 10/07/2012 18:15
).
Para poner algo de contexto, aquí está el código con el que estoy trabajando y lo que ya he probado:
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
Como puede ver, estoy usando
df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))
aquí, lo cual no funciona ya que estoy trabajando con números enteros, no con cadenas. Creo que necesito usarlo, datetime.date.fromtimestamp
pero no estoy muy seguro de cómo aplicarlo a todo df.date
.
Gracias.
Estos parecen ser segundos desde la época.
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 intentas usar:
df[DATE_FIELD]=(pd.to_datetime(df[DATE_FIELD],***unit='s'***))
y recibe un error:
"pandas.tslib.OutOfBoundsDatetime: no se puede convertir la entrada con unidades'"
Esto significa que DATE_FIELD
no se especifica en segundos.
En mi caso, fueron milisegundos EPOCH time
.
La conversión funcionó usando lo siguiente:
df[DATE_FIELD]=(pd.to_datetime(df[DATE_FIELD],unit='ms'))