2016-08-14 181 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