Converti l'ora unix in data leggibile in dataframe panda


110

Ho un dataframe con tempi e prezzi unix. Voglio convertire la colonna dell'indice in modo che venga visualizzata in date leggibili dall'uomo.

Quindi, ad esempio, ho datecome 1349633705nella colonna dell'indice ma vorrei che fosse mostrato come 10/07/2012(o almeno 10/07/2012 18:15).

Per un po 'di contesto, ecco il codice con cui sto lavorando e quello che ho già provato:

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   

Come puoi vedere sto usando df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))qui che non funziona poiché sto lavorando con numeri interi, non stringhe. Penso di aver bisogno di usare, datetime.date.fromtimestampma non sono abbastanza sicuro di come applicarlo a tutto df.date.

Grazie.

Risposte:


221

Questi sembrano essere secondi dall'epoca.

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

1
e in 0.13 sarai in grado di usare date_unit quando read_json: D
Andy Hayden

Grande! La tua soluzione ha perfettamente senso. Pandas: La conversione in Timestamp funziona abbastanza bene anche ora che so di to_datetime.
WA Carnegie

Solo un altro punto. Questo non ha funzionato per me in 0.11, ma andava bene in 0.12+
WA Carnegie

1
Questa soluzione mi dà OverflowError: Python int too large to convert to C long.
se __name__ è Nessuno

2
Non importa, aveva un timestamp in millisecondi, doveva solo lambda x: x/1000.0, o unit='ms'.
se __name__ è Nessuno

48

Se provi a usare:

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

e ricevi un errore:

"pandas.tslib.OutOfBoundsDatetime: impossibile convertire l'input con le unità"

Ciò significa che il DATE_FIELDnon è specificato in secondi.

Nel mio caso, sono stati milli secondi - EPOCH time.

La conversione ha funzionato utilizzando di seguito:

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

15

Supponendo che abbiamo importato pandas as pded dfè il nostro dataframe

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

per me va bene.


0

In alternativa, modificando una riga del codice sopra:

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

Dovrebbe anche funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.