2013-09-26 144 views
8

Tôi có khung dữ liệu sau:Chuyển đổi thành một dòng số nguyên trong gấu trúc

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 

Bây giờ, tôi muốn hàng nhóm đó là trong vòng một phút. Vì vậy, tôi chia chuỗi thời gian với 100. Tôi nhận được điều này:

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 

Như đã giải thích ở trên, tôi muốn tạo nhóm dựa trên thời gian. Vì vậy, các nhóm con được mong đợi sẽ là các hàng có số lần 1379945413799456. Tôi làm điều này:

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 

Làm thế nào để chuyển đổi ts thành một Integer Dòng từ int() không có một dòng hoặc một danh sách như một cuộc tranh cãi? Có phương pháp nào trong gấu trúc thực hiện điều này không?

Trả lời

13

Thử chuyển đổi với astype:

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

Sửa

On gợi ý bởi @Rutger Kassies một cách đẹp hơn sẽ được đúc hàng loạt và sau đó groupby:

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

ts_grouped = rise_p.groupby('ts') 

... 
+3

Sử dụng 'astype()' là chắc chắn đúng, nhưng tránh việc hiểu danh sách tất cả cùng nhau sẽ tốt hơn. Giống như 'ts ['time'] = (ts.time/100) .astype ('int')' và sau đó nhóm lại với 'ts.grouby ('time')' và cứ thế ... –

+0

Có thỏa thuận, tránh việc hiểu danh sách sẽ đẹp hơn nhiều, sẽ chỉnh sửa câu trả lời của tôi để phản ánh. – drexiya

4

Dưới đây là một cách khác để giải quyết vấn đề của bạn

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 

Chuyển đổi timestamps kỷ nguyên của bạn để giây

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

Đặt index

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 1 phút và có nghĩa là kết quả (how= có thể là một chức năng tùy ý cũng)

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! Cách tiếp cận này có vẻ tốt. Một số phương pháp mới đối với tôi. Tôi sẽ thử. Bây giờ, tôi sẽ sử dụng câu trả lời được đưa ra bởi @drexiya. – Geekster

+0

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

+0

Thanx @Jeff. Tôi tìm thấy tài nguyên này sau khi đăng nhận xét. Vì vậy, tôi đã xóa nhận xét đề cập đến như vậy. – Geekster