Convierta el tiempo de Unix en una fecha legible en pandas dataframe

110

Tengo un marco de datos con tiempos y precios 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 algo de contexto, aquí está el código con el que estoy trabajando y lo que ya probé:

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 que no funciona ya que estoy trabajando con enteros, no con cadenas. Creo que necesito usar, datetime.date.fromtimestamppero no estoy muy seguro de cómo aplicar esto a la totalidad de df.date.

Gracias.

WA Carnegie
fuente

Respuestas:

221

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
fuente
1
y en 0.13 podrás usar date_unit cuando read_json: D
Andy Hayden
¡Excelente! Tu solución tiene mucho sentido. Pandas: La conversión a marcas de tiempo se realiza bastante bien también ahora sé acerca de to_datetime.
WA Carnegie
Solo otro punto. Esto no funcionó para mí en 0.11, pero bien en 0.12+
WA Carnegie
1
Esta solución me da OverflowError: Python int too large to convert to C long.
si __name__ es None
2
No importa, tenía una marca de tiempo de milisegundos, solo tenía que hacerlo lambda x: x/1000.0, o unit='ms'.
si __name__ es None
48

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 la unidad 's'"

Esto significa DATE_FIELDque no se especifica en segundos.

En mi caso, fueron milisegundos - EPOCH time.

La conversión funcionó usando a continuación:

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

Suponiendo que importamos pandas as pdy dfes nuestro marco de datos

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

funciona para mi.

fahim reza
fuente
0

Alternativamente, cambiando una línea del código anterior:

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

También debería funcionar.

ipramusinto
fuente