2016-04-25 272 views
0

我是新的熊貓,我無法找到方法,如何使用另一個日期範圍通過切片獲取日期範圍。 例與使用整數文件分片效果很好:如何切片日期時間範圍與另一個日期時間範圍

In [47]: pd.date_range('04-25-2016 10:00', '04-25-2016 20:00', freq='min')[1:3] 
Out[47]: DatetimeIndex(['2016-04-25 10:01:00', '2016-04-25 10:02:00'], dtype='datetime64[ns]', freq='T') 

但使用另一date_range切片不工作:

In [71]: work_range = pd.date_range('04-25-2016 10:00', '04-25-2016 20:00', freq='min') 
In [72]: break_range = pd.date_range('04-25-2016 11:00', '04-25-2016 13:30', freq='min') 

In [73]: free_time = work_range[break_range] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-73-361d67af3291> in <module>() 
----> 1 free_time = work_range[break_range] 

/usr/local/lib/python2.7/dist-packages/pandas/tseries/base.pyc in __getitem__(self, key) 
    173    attribs['freq'] = freq 
    174 
--> 175    result = getitem(key) 
    176    if result.ndim > 1: 
    177     return result 

IndexError: index -803545088 is out of bounds for axis 1 with size 601 

或者我用date_range走錯了路? 我的完整的例子:

import pandas as pd 


work_range = pd.date_range('04-25-2016 10:00', '04-25-2016 20:00', freq='min') 

break_ranges = list() 
break_ranges.append(pd.date_range('04-25-2016 11:00', '04-25-2016 13:30', freq='min')) 
break_ranges.append(pd.date_range('04-25-2016 15:00', '04-25-2016 15:30', freq='min')) 
break_ranges.append(pd.date_range('04-25-2016 13:00', '04-25-2016 13:05', freq='min')) 

free_ranges = list() 
for range in break_ranges: 
    # slicing work_range here and put it into `free_ranges` list 
+1

是你想要的:'work_range [work_range.isin(break_range)]'?但它會工作,只有當所有部分(日期,時間,小時,分鐘等)匹配 – MaxU

+0

順便說一句,我當然希望'date_rage'是一個錯字... – Alexander

回答

1

如果你的數據框使用DatetimeIndex索引:

work_range = pd.date_range('04-25-2016 10:00', '04-25-2016 20:00', freq='min') 
break_range = pd.date_range('04-25-2016 11:00', '04-25-2016 13:30', freq='min') 
df = pd.DataFrame({'col': range(len(work_range))}, index=work_range) 

>>> len(work_range) 
601 

>>> len(break_range) 
151 

>>> df.shape 
(601, 1) 

# Use `.loc` to select specific range. 
>>> df.loc[break_range].shape 
(151, 1) 

如果你的指數是一個列值:

df['idx'] = df.index 
>>> df.loc[df.idx.isin(break_range)].shape 
(151, 2) 

從結果中排除的日期範圍,只需使用蒂爾達(~)否定字符:

>>> df.loc[~df.idx.isin(break_range)].shape 
(450, 2) 

而且如果你只是使用索引本身。

>>> work_range[work_range.isin(break_range)].shape 
(151,) 

# To exclude dates: 
>>> work_range[~work_range.isin(break_range)].shape 
(450,) 
+0

謝謝。其實我想使用list方法'reverse()'從'work_range'中刪除'break_range'。但代字號在那裏工作得很好。所以,我最終成爲'work_range [〜work_range.isin(break_range)]。shape' – vlad