Converta hora unix em data legível no dataframe do pandas

110

Eu tenho um dataframe com horários e preços do Unix. Desejo converter a coluna do índice para que seja exibida em datas legíveis por humanos.

Portanto, por exemplo, tenho datecomo 1349633705na coluna de índice, mas gostaria que fosse mostrado como 10/07/2012(ou pelo menos 10/07/2012 18:15).

Para algum contexto, aqui está o código com o qual estou trabalhando e o que já tentei:

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 você pode ver, estou usando df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))aqui, o que não funciona, pois estou trabalhando com inteiros, não com strings. Acho que preciso usar, datetime.date.fromtimestampmas não tenho certeza de como aplicar isso ao todo df.date.

Obrigado.

WA Carnegie
fonte

Respostas:

220

Estes parecem segundos desde a é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
fonte
1
e em 0.13 você poderá usar date_unit quando read_json: D
Andy Hayden
Ótimo! Sua solução faz todo o sentido. Pandas: A conversão para timestamps funciona muito bem agora que sei sobre to_datetime.
WA Carnegie,
Apenas outro ponto. Isso não funcionou para mim em 0,11, mas bom em 0,12+
WA Carnegie
1
Essa solução me dá OverflowError: Python int too large to convert to C long.
se __name__ for Nenhum de
2
Deixa pra lá, tinha timestamp em milissegundos, precisava lambda x: x/1000.0, ou unit='ms'.
se __name__ for Nenhum
48

Se você tentar usar:

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

e receber um erro:

"pandas.tslib.OutOfBoundsDatetime: não é possível converter a entrada com a unidade 's'"

Isso significa que DATE_FIELDnão é especificado em segundos.

No meu caso, foram milissegundos - EPOCH time.

A conversão funcionou usando a seguir:

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

Supondo que importamos pandas as pde dfé nosso dataframe

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

funciona para mim.

fahim reza
fonte
0

Como alternativa, alterando uma linha do código acima:

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

Também deve funcionar.

ipramusinto
fonte