【问题标题】:get DataFrame rows matching dates获取匹配日期的 DataFrame 行
【发布时间】:2017-12-12 00:26:40
【问题描述】:

假设我有以下 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'])

知道我在这里做错了什么(我使用的是熊猫版本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))])

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

    • 这回答了我的第一个问题,谢谢!对第二个有任何想法吗?
    • 在这里找到了我第二个问题的答案:stackoverflow.com/questions/45945104/…
    • 非常高兴能提供帮助!
    【解决方案2】:

    首先使用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

    【讨论】:

      【解决方案3】:

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

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

      第二个问题是:

      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。

      【讨论】:

      • 请注意,.ixdeprecated,因为 0.20.1
      • 是的,我更多地将它用于 IMO 的开发,它对于混合整数和字符串引用更具可读性。 .loc 和 .iloc 是推荐用于生产的选项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 2018-01-20
      • 2021-12-03
      相关资源
      最近更新 更多