2016-08-14 188 views
-1

我有一個熊貓數據幀是這樣的:選擇日從熊貓數據框中

 
╔════════════╦═══════╗ 
║ DATE  ║ VALUE ║ 
╠════════════╬═══════╣ 
║ 2011-01-07 ║ 1  ║ 
╠════════════╬═══════╣ 
║ 2011-01-08 ║ 2  ║ 
╠════════════╬═══════╣ 
║ 2011-01-09 ║ 1  ║ 
╠════════════╬═══════╣ 
║ 2011-01-10 ║ 1  ║ 
╠════════════╬═══════╣ 
║ 2011-01-20 ║ 1  ║ 
╠════════════╬═══════╣ 
║ 2011-01-20 ║ 1  ║ 
╚════════════╩═══════╝ 

我想現在就做的是選擇三天之後開始2011-01-20。

 
╔════════════╦═══════╗ 
║ DATE  ║ VALUE ║ 
╠════════════╬═══════╣ 
║ 2011-01-20 ║ 1  ║ 
╠════════════╬═══════╣ 
║ 2011-01-20 ║ 1  ║ 
╚════════════╩═══════╝ 

我想做到的是如下數據幀:

 
╔════════════╦═══════╗ 
║ DATE  ║ VALUE ║ 
╠════════════╬═══════╣ 
║ 2011-01-09 ║ 1  ║ 
╠════════════╬═══════╣ 
║ 2011-01-10 ║ 1  ║ 
╠════════════╬═══════╣ 
║ 2011-01-20 ║ 1  ║ 
╠════════════╬═══════╣ 
║ 2011-01-20 ║ 1  ║ 
╚════════════╩═══════╝ 

我不想做的是groupby或重新採樣數據通過df.loc['2011-01-20' - pd.Timedelta(3, unit='d'):'2011-01-20']結果在以下日期框選擇框架或類似的東西,因爲我需要保留下面的處理結構。有人知道我能如何解決這個問題嗎?提前致謝!

+0

目前尚不清楚你想實現什麼......你想選擇'2011-01-17'和'2011-01-20'之間的所有日期 - 在這種情況下,我不明白你想要的數據設置... – MaxU

+0

不,我不想t o重新採樣數據幀。我希望得到三個不同的日期(包括)'''2011-01-20''',並且保留所有出現不止一次的日期,導致如上表中所示的數據幀。 – sascha

回答

2

您可以創建一個連續的ID列,以便每個日期都有一個唯一的ID與日增加,然後子集基於id列:

import pandas as pd 
# sort the `DATE` column and create an id for each date 
df['DATE'] = pd.to_datetime(df.DATE).sort_values() 
df['DateId'] = df.groupby('DATE').grouper.group_info[0] 

# find out the id for the target date 
MaxId = df.DateId[df.DATE == '2011-01-20'].drop_duplicates().values 

# subset based on the id column and the MaxId 
df.loc[df.DateId.isin(range(MaxId - 2, MaxId + 1)),['DATE', 'VALUE']] 

#   DATE VALUE 
# 2 2011-01-09  1 
# 3 2011-01-10  1 
# 4 2011-01-20  1 
# 5 2011-01-20  1 
+0

真是個聰明的想法。它對我的問題非常有效。非常感謝! – sascha

+2

我喜歡你的「排名」主意!我認爲我們也可以使用rank()方法 - 'df.assign(date_rank = df.DATE.rank(method ='min')。astype(int))' – MaxU

+1

@MaxU'rank()'方法更簡潔這個問題的方法。以前不知道這個方法。肯定是答案的一個加號。 – Psidom

0

試試這個使用pandas.ix 提示:df.ix(start, stop)

df['Date'] =pd.to_datetime(df['Date']).sort_values() 
df.ix[df[df.Date =='2011-01-20'].index[0]-2: max(df[df.Date =='2011-01-20'].index)] 

     Date Value 
2 2011-01-09  1 
3 2011-01-10  1 
4 2011-01-20  1 
5 2011-01-20  1 
6 2011-01-20  1