2013-09-26 5 views
8

Ho la seguente struttura dei dati:Converti galleggiante Series in una serie numero intero panda

In [31]: rise_p 
Out[31]: 
     time magnitude 
0 1379945444 156.627598 
1 1379945447 1474.648726 
2 1379945448 1477.448999 
3 1379945449 1474.886202 
4 1379945699 1371.454224 

Ora, voglio raggruppare le righe che sono all'interno di un minuto. Quindi divido le serie temporali con 100. Ottengo questo:

In [32]: rise_p/100 
Out[32]: 
      time magnitude 
0 13799454.44 1.566276 
1 13799454.47 14.746487 
2 13799454.48 14.774490 
3 13799454.49 14.748862 
4 13799456.99 13.714542 

Come spiegato sopra, voglio creare gruppi in base al tempo. I sottogruppi, quindi attesi, sarebbero file con orari 13799454 e 13799456. Faccio questo:

In [37]: ts = rise_p['time']/100 

In [38]: s = rise_p/100 

In [39]: new_re_df = [s.iloc[np.where(int(ts) == int(i))] for i in ts] 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-39-5ea498cf32b2> in <module>() 
----> 1 new_re_df = [s.iloc[np.where(int(ts) == int(i))] for i in ts] 

TypeError: only length-1 arrays can be converted to Python scalars 

Come faccio a convertire ts in una serie Integer dal int() non prende una serie o un elenco come argomento? C'è qualche metodo in Panda che lo fa?

risposta

13

Prova conversione con astype:

new_re_df = [s.iloc[np.where(ts.astype(int) == int(i))] for i in ts] 

Modifica

Su suggerimento da @Rutger Kassies un modo migliore sarebbe quello di lanciare serie e poi groupby:

rise_p['ts'] = (rise_p.time/100).astype('int') 

ts_grouped = rise_p.groupby('ts') 

... 
+3

Utilizzando 'astype()' è sicuramente corretto, ma evitando la comprensione della lista tutti insieme sarebbe ancora meglio. Come 'ts ['time'] = (ts.time/100) .astype ('int')' e quindi raggruppando con 'ts.grouby ('time')' e così via ... –

+0

Sì concordato, evitando il la comprensione delle liste sarebbe molto più bella, modificherà la mia risposta per riflettere. – drexiya

4

Ecco un modo diverso per risolvere il tuo problema

In [3]: df 
Out[3]: 
     time magnitude 
0 1379945444 156.627598 
1 1379945447 1474.648726 
2 1379945448 1477.448999 
3 1379945449 1474.886202 
4 1379945699 1371.454224 

In [4]: df.dtypes 
Out[4]: 
time   int64 
magnitude float64 
dtype: object 

Convertire i tuoi timestamp epoca al secondo

In [7]: df['time'] = pd.to_datetime(df['time'],unit='s') 

impostare l'indice

In [8]: df.set_index('time',inplace=True) 

In [9]: df 
Out[9]: 
         magnitude 
time        
2013-09-23 14:10:44 156.627598 
2013-09-23 14:10:47 1474.648726 
2013-09-23 14:10:48 1477.448999 
2013-09-23 14:10:49 1474.886202 
2013-09-23 14:14:59 1371.454224 

Groupby 1min e intendono i risultati (how= può essere una funzione arbitraria così)

In [10]: df.resample('1Min',how=np.mean) 
Out[10]: 
         magnitude 
time        
2013-09-23 14:10:00 1145.902881 
2013-09-23 14:11:00   NaN 
2013-09-23 14:12:00   NaN 
2013-09-23 14:13:00   NaN 
2013-09-23 14:14:00 1371.454224 
+0

Grazie @Jeff! Questo approccio sembra buono. Alcuni metodi sono nuovi per me. Farò un tentativo. Per ora, userò la risposta data da @drexiya. – Geekster

+0

http://pandas.pydata.org/pandas-docs/dev/timeseries.html#time-zone-handling – Jeff

+0

Grazie @Jeff. Ho trovato questa risorsa dopo aver postato il commento. Quindi avevo cancellato il commento menzionando lo stesso. – Geekster