2013-09-26 13 views
8

Mam następujący ramkę danych:Konwersja pływaka w serii do serii całkowitą w pand

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 

Teraz chcę grupować wiersze, które w ciągu minuty. Więc podzielę serię czasową na 100. Otrzymuję:

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 

Jak wyjaśniono powyżej, chcę tworzyć grupy na podstawie czasu. Tak więc oczekiwane podgrupy byłyby wierszami o czasach 13799454 i 13799456.

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 

Jak przekonwertować ts się z serii Integer od int() nie podjąć szereg lub listę jako argument: mogę to zrobić? Czy jest jakaś metoda w pandach, która to robi?

Odpowiedz

13

Spróbuj przekonwertować z astype:

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

Edycja

Na sugestię @Rutger Kassies ładniejszy sposób byłoby rzucić serię i następnie GroupBy:

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

ts_grouped = rise_p.groupby('ts') 

... 
+3

Używanie 'astype()' jest zdecydowanie poprawne, ale unikanie wspólnego rozumienia listy byłoby jeszcze lepsze. Podobnie jak 'ts ['time'] = (ts.time/100) .astype ('int')' a następnie grupowanie za pomocą 'ts.grouby ('time')' i tak dalej ... –

+0

Zgadzam się, unikając zrozumienie listy byłoby znacznie przyjemniejsze, zredaguję moją odpowiedź, by odzwierciedlić. – drexiya

4

Oto inny sposób rozwiązania problemu

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 

Konwersja znaczniki czasu epoki do sekundy

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

Zestaw indeks

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 i średnie wyniki (how= może być dowolna funkcja, jak również)

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

Thanx @Jeff! To podejście wygląda dobrze. Niektóre metody są dla mnie nowe. Spróbuję tego. Na razie użyję odpowiedzi udzielonej przez @drexiya. – Geekster

+0

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

+0

Thanx @Jeff. Znalazłem ten zasób po opublikowaniu komentarza. Usunąłem komentarz o tym samym. – Geekster

Powiązane problemy