使用查询提取日期范围

时间:2014-07-02 23:37:10

标签: python pandas

说我有一个日期列:

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)
没有运气。我得到一个空数据帧,即使我可以看到这两个日期之间的数据。

如何在这两个日期之间检索数据? (请注意,数据框中的日期可能不会出现))。我可以使用查询吗?

2 个答案:

答案 0 :(得分: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 :(得分: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是外部变量,因此在查询中需要@