Convierta la hora de Unix en una fecha legible en el marco de datos de pandas

Resuelto W A Carnegie asked hace 11 años • 5 respuestas

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 datecomo 1349633705en 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.fromtimestamppero no estoy muy seguro de cómo aplicarlo a todo df.date.

Gracias.

W A Carnegie avatar Oct 08 '13 01:10 W A Carnegie
Aceptado

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
Jeff avatar Oct 07 '2013 18:10 Jeff

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_FIELDno 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')) 
Parachute avatar Jul 07 '2017 17:07 Parachute