簡體   English   中英

獲取匹配日期的DataFrame行

[英]get DataFrame rows matching dates

假設我有以下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文檔SO答案 ,我應該能夠使用以下命令獲取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))])

我顛倒了我搜索物品的順序,所以:

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

另一種方法可能是使用布爾索引。

在這里,您提供了必須為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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM