2014-07-02 81 views
1

說我有一個日期一欄:使用查詢,提取日期範圍

df.my_dates 

0 2014-06-08 
1 2014-03-01 
... 
148 2014-06-25 
149 2014-06-02 
Name: my_dates, Length: 150, dtype: datetime64[ns] 

和日期如下:

> d1 
datetime.datetime(2014, 6, 5, 0, 0) 

> d2 
datetime.datetime(2014, 6, 9, 0, 0) 

我想提取這兩個日期之間的所有條目。我曾嘗試過:

# The statement below translates into "'2014-06-05' > my_dates > '2014-06-09'" 
my_query = "'{}' > my_dates > '{}'".format(d1.strftime("%Y-%m-%d"), 
              d2.strftime("%Y-%m-%d")) 
df.reset_index().query(my_query) 

沒有運氣。即使我可以看到這兩個日期之間的數據,我也會得到一個空的數據框。

如何檢索這兩個日期之間的數據? (請注意,數據框中的日期可能不會發生在數據框中))。我可以使用查詢嗎?

回答

1

您可以按照多個標準使用標準篩選:&運算符和每個標準周圍的括號。熊貓可以比較開箱即用的日期。

import pandas as pd 
from datetime import datetime 

df = pd.DataFrame({"date": pd.date_range(start='2014-06-02', freq='2D', 
             periods=50), 
        "value": 1}) 

d1 = datetime(2014, 6, 5, 0, 0) 
d2 = datetime(2014, 6, 9, 0, 0) 

df = df[(df['date'] > d1) & (df['date'] < d2)] 

print df 

此打印:

 date value 
2 2014-06-06  1 
3 2014-06-08  1 
1

如果你想使用query方法,有兩件事情需要改變:

In [32]: 

from datetime import datetime 
d1 = datetime(2014, 6, 5, 0, 0) 
d2 = datetime(2014, 6, 9, 0, 0) 
d1=pd.to_datetime(d1) #or pd.DatetimeIndex(d1) 
d2=pd.to_datetime(d2) 
print df 
      val  
0 2014-06-08 
1 2014-03-01 
148 2014-06-25 
149 2014-06-02 
In [33]: 

print df.query('(@d1 < val)&(val<@d2)') 
     val  
0 2014-06-08 

你看,1,d1d2有轉換爲timestamps。第二,d1d2是外部變量,因此在查詢中需要它們前面的@