获取与日期匹配的DataFrame行

时间:2017-12-12 00:26:40

标签: python pandas

假设我有以下DataFrame:

df = pd.DataFrame({'item': ['Subway', 'Pasta', 'Chipotle'],
                   'cost': [10, 5, 9],
                   'date': ['2017-12-01', '2017-11-01', '2017-10-01']})
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')

我可以获取2017-10中的所有项目(在这种情况下只有一项):

print(df.set_index('date')['2017-10'])

根据pandas documentationthis SO answer,我应该可以使用以下命令从2017-102017-11(本例中为2项)获取所有项目,但我得到一个空的DataFrame:

print(df.set_index('date')['2017-10':'2017-11'])

知道我在这里做错了什么(我正在使用pandas版本0.21.0)?

此外,我是否有一种有效的方法可以获取2017-102017-12中的所有项目(跳过2017-11)?我提出了以下解决方案,但我不应该像这样创建新列:

df['month'] = df['date'].dt.month
df['year'] = df['date'].dt.year
print(df[((df.month==10) & (df.year==2017) | (df.month==12) & (df.year==2017))])

3 个答案:

答案 0 :(得分:1)

我颠倒了我搜索物品的顺序,所以:

import pandas as pd 

df = pd.DataFrame({'item': ['Subway', 'Pasta', 'Chipotle'],
                   'cost': [10, 5, 9],
                   'date': ['2017-12-01', '2017-11-01', '2017-10-01']})
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')

print(df.set_index('date')['2017-11':'2017-10'])

对于您的日期'它从高到低。通过切换它们我得到了这个输出:

            cost      item
date                      
2017-11-01     5     Pasta
2017-10-01     9  Chipotle

答案 1 :(得分:1)

首先将set_index()DatetimeIndex一起使用。然后,您可以使用所需的索引方法。

df.set_index(pd.DatetimeIndex(df.date), inplace=True)

df.sort_index().loc['2017-10':'2017-11']

            cost       date      item
date                                 
2017-10-01     9 2017-10-01  Chipotle
2017-11-01     5 2017-11-01     Pasta

关于您的第二个问题,您还可以在month后访问DatetimeIndex媒体资源。

df.loc[df.index.month.isin([10,12])]

            cost       date      item
date                                 
2017-12-01    10 2017-12-01    Subway
2017-10-01     9 2017-10-01  Chipotle

(对于第二部分,也要按年份编制索引,添加& df.index.year == 2017

答案 2 :(得分:0)

另一种方法可能是使用布尔索引。

在这里,您提供必须为true的语句才能返回行。

对于你的第二个问题,这将是:

df_October_and_December = df.ix[((df['date'] >= '2017-10-01') & (df['date'] <= '2017-10-31')) | ((df['date'] >= '2017-12-01') & (df['date'] <= '2017-12-31')) ,:]

您想要的更优雅的版本是:

df_October_and_December = df.ix[(df['date'].dt.month.isin([10,12])) ,:]

我倾向于使用.ix引用它的灵活性,并在应用程序允许的情况下优化为.loc或.iloc。