2012-05-12 14 views
16

Tôi làm việc tại một thời gian khá sử dụng python và gấu trúc để phân tích một tập hợp các dữ liệu hàng giờ và thấy nó khá đẹp (Đến từ Matlab.)gấu trúc, python - làm thế nào để chọn thời điểm cụ thể trong chuỗi thời gian

Bây giờ tôi bị mắc kẹt. Tôi tạo ra tôi DataFrame như thế:

SamplingRateMinutes=60 
index = DateRange(initialTime,finalTime, offset=datetools.Minute(SamplingRateMinutes)) 
ts=DataFrame(data, index=index) 

Những gì tôi muốn làm bây giờ là để chọn dữ liệu cho tất cả các ngày tại giờ 10 đến 13 và 20-23 để sử dụng dữ liệu để tính toán thêm. Cho đến nay tôi thái lát các dữ liệu sử dụng

selectedData=ts[begin:end] 

Và tôi chắc chắn để có được một số loại vòng lặp bẩn để chọn dữ liệu cần thiết. Nhưng phải có một cách thanh lịch hơn để lập chỉ mục những gì tôi muốn. Tôi chắc chắn đây là một vấn đề thường gặp và giải pháp trong giả nên nhìn hơi như thế:

myIndex=ts.index[10<=ts.index.hour<=13 or 20<=ts.index.hour<=23] 
selectedData=ts[myIndex] 

Để đề cập đến tôi là một kỹ sư và không programer :) ... nhưng

Trả lời

7

Dưới đây là một ví dụ mà không những gì bạn muốn:

In [32]: from datetime import datetime as dt 

In [33]: dr = p.DateRange(dt(2009,1,1),dt(2010,12,31), offset=p.datetools.Hour()) 

In [34]: hr = dr.map(lambda x: x.hour) 

In [35]: dt = p.DataFrame(rand(len(dr),2), dr) 

In [36]: dt 

Out[36]: 
<class 'pandas.core.frame.DataFrame'> 
DateRange: 17497 entries, 2009-01-01 00:00:00 to 2010-12-31 00:00:00 
offset: <1 Hour> 
Data columns: 
0 17497 non-null values 
1 17497 non-null values 
dtypes: float64(2) 

In [37]: dt[(hr >= 10) & (hr <=16)] 

Out[37]: 
<class 'pandas.core.frame.DataFrame'> 
Index: 5103 entries, 2009-01-01 10:00:00 to 2010-12-30 16:00:00 
Data columns: 
0 5103 non-null values 
1 5103 non-null values 
dtypes: float64(2) 
+0

Hoạt động! Cảm ơn rất nhiều! –

+2

Đây là cách giải pháp này sẽ được thực hiện trong cú pháp cho 0.10 và kết hợp nó với câu trả lời của Wes bên dưới: 'dr = pd.date_range (dt (2009,1,1), dt (2010,12,31), freq = 'H'); dt = pd.DataFrame (rand (len (dr), 2), dr); giờ = dt.index.hour; bộ chọn = ((10 <= giờ) & (giờ <= 13)) | ((20 <= giờ) & (giờ <= 23)) dữ liệu = dt [chọn] ' –

24

Trong gấu trúc sắp tới 0.8.0, bạn sẽ có thể viết

hour = ts.index.hour 
selector = ((10 <= hour) & (hour <= 13)) | ((20 <= hour) & (hour <= 23)) 
data = ts[selector] 
6

Như có vẻ lộn xộn trong nhận xét của tôi ở trên, tôi quyết định cung cấp một câu trả lời mà là một bản cập nhật cú pháp cho gấu trúc 0.10.0 về câu trả lời của Marc, kết hợp với Wes' gợi ý:

import pandas as pd 
from datetime import datetime 

dr = pd.date_range(datetime(2009,1,1),datetime(2010,12,31),freq='H') 
dt = pd.DataFrame(rand(len(dr),2),dr) 
hour = dt.index.hour 
selector = ((10 <= hour) & (hour <= 13)) | ((20<=hour) & (hour<=23)) 
data = dt[selector] 
+0

có xung đột giữa gói dt và biến dt –

0

Pandas DataFrame có một built-in chức năng pandas.DataFrame.between_time

df = pd.DataFrame(np.random.randn(1000, 2), 
        index=pd.date_range(start='2017-01-01', freq='10min', periods=1000)) 

Tạo 2 khung dữ liệu cho mỗi khoảng thời gian:

df1 = df.between_time(start_time='10:00', end_time='13:00') 
df2 = df.between_time(start_time='20:00', end_time='23:00') 

khung dữ liệu bạn muốn được sáp nhập và sắp xếp df1 và df2:

pd.concat([df1, df2], axis=0).sort_index()