首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取DataFrame行匹配日期

获取DataFrame行匹配日期
EN

Stack Overflow用户
提问于 2017-12-12 00:26:40
回答 3查看 1.8K关注 0票数 0

假设我有以下DataFrame:

代码语言:javascript
复制
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中的所有项(本例中只有一项):

代码语言:javascript
复制
print(df.set_index('date')['2017-10'])

根据熊猫文献这就是答案,我应该能够使用以下命令从2017-102017-11 (在本例中为2项)获取所有项,但我得到的是一个空的DataFrame:

代码语言:javascript
复制
print(df.set_index('date')['2017-10':'2017-11'])

你知道我在这里做错了什么吗(我用的是熊猫版0.21.0)?

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

代码语言:javascript
复制
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))])
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-12 00:39:53

我改变了我寻找物品的顺序,所以:

代码语言:javascript
复制
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'])

你的“约会”从高到低。通过切换它们,我得到了以下输出:

代码语言:javascript
复制
            cost      item
date                      
2017-11-01     5     Pasta
2017-10-01     9  Chipotle
票数 1
EN

Stack Overflow用户

发布于 2017-12-12 01:09:15

首先,将set_index()DatetimeIndex结合使用。然后你可以使用你想要的索引方法。

代码语言:javascript
复制
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属性。

代码语言:javascript
复制
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)

票数 1
EN

Stack Overflow用户

发布于 2017-12-12 01:12:17

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

在这里,您提供了必须为true的语句,以便返回行。

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

代码语言:javascript
复制
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')) ,:]

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

代码语言:javascript
复制
df_October_and_December = df.ix[(df['date'].dt.month.isin([10,12])) ,:]

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47763590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档