Python 获取与日期匹配的数据帧行

Python 获取与日期匹配的数据帧行,python,pandas,Python,Pandas,假设我有以下数据帧: 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

假设我有以下数据帧:

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-10':'2017-11'])
我能够获得2017-10年<代码>中的所有项目(本例中只有一项):

根据and,我应该能够使用以下命令获取从
2017-10
2017-11
(本例中为2项)的所有项目,但我得到的是一个空数据框:

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-10':'2017-11'])
知道我在这里做错了什么吗(我使用的是pandas版本
0.21.0

此外,是否有一种有效的方法可以获取
2017-10
2017-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))])

我颠倒了搜索项目的顺序,因此:

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

我颠倒了搜索项目的顺序,因此:

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
首先将
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
关于第二个问题,您还可以在拥有
DatetimeIndex
后访问
month
属性

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

首先使用
设置索引()
日期时间索引
。然后你可以使用你想要的索引方法

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
关于第二个问题,您还可以在拥有
DatetimeIndex
后访问
month
属性

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

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

这里提供的语句必须为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')) ,:]

鉴于.ix的灵活性,我倾向于使用.ix引用,如果应用程序允许,我会将其细化为.loc或.iloc。

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

这里提供的语句必须为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')) ,:]

鉴于.ix的灵活性,我倾向于使用.ix引用,如果应用程序允许,我会将其细化为.loc或.iloc。

这回答了我的第一个问题,谢谢!对第二个问题有什么想法吗?在这里找到了我第二个问题的答案:真棒,很高兴能帮忙!这回答了我的第一个问题谢谢!对第二个问题有什么想法吗?在这里找到了我第二个问题的答案:真棒,很高兴能帮忙!请注意,
.ix
是因为
0.20.1
。是的,作为IMO,我更多地使用它进行开发,它对于混合整数和字符串引用更具可读性。loc和.iloc是推荐用于生产的选项。请注意,
.ix
是因为
0.20.1
。是的,作为IMO,我更多地使用它进行开发,它对于混合整数和字符串引用更具可读性。loc和.iloc是推荐的生产选项。