2016-09-25 81 views
1

我有一个数据帧,它是日期索引(d-m-y)。我想创建一个二进制特性列,表示日期是否是本月的第二个星期六。
到目前为止,我已经得到了这是什么:在日期索引熊猫数据帧中标记某些日期

def get_second_true(x): 
    second = None 
    for index, is_true in enumerate(x): 
     if is_true and second is None: 
      return index 
     if is_true and second is not None: 
      second = True 

second_saturdays = df.groupby(['month', 'year']).apply(
    lambda x: x.index.weekday == 6 
    ).apply(get_second_true) 

我无法把它恢复成一系列它涉及到原来的数据帧的指数以这样的方式,每行都有一个标签,无论是是否是第二个星期六。

这感觉就像一个常见的情景,但我无法找到用于做这种事情的术语。我看过unstackreset_index,但我不明白他们是否有足够的深度来了解是否可以使用它们,或者甚至需要多级索引。

+0

我认为R社区可能知道这是什么,因为数据帧在那里很安静。 – theSage

回答

3

有在大熊猫一个特殊频率等WOM-2SUN(星期-OF-月:第二个星期日),这样你就可以这样来做:

In [88]: df = pd.DataFrame({'date':pd.date_range('2000-01-01', periods=365)}) 

In [89]: df 
Out[89]: 
      date 
0 2000-01-01 
1 2000-01-02 
2 2000-01-03 
3 2000-01-04 
4 2000-01-05 
5 2000-01-06 
6 2000-01-07 
7 2000-01-08 
8 2000-01-09 
9 2000-01-10 
..   ... 
355 2000-12-21 
356 2000-12-22 
357 2000-12-23 
358 2000-12-24 
359 2000-12-25 
360 2000-12-26 
361 2000-12-27 
362 2000-12-28 
363 2000-12-29 
364 2000-12-30 

[365 rows x 1 columns] 

In [90]: df.loc[df.date.isin(pd.date_range(start=df.date.min(), end=df.date.max(), freq='WOM-2SUN'))] 
Out[90]: 
      date 
8 2000-01-09 
43 2000-02-13 
71 2000-03-12 
99 2000-04-09 
134 2000-05-14 
162 2000-06-11 
190 2000-07-09 
225 2000-08-13 
253 2000-09-10 
281 2000-10-08 
316 2000-11-12 
344 2000-12-10 

UPDATE:从熊猫0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers开始。

2

一天是第二月份的星期六如果平日== 6和天蛾> 7和月的一天的< = 14

+0

这解决了我的问题,谢谢。我想问一下我定义的操作类型是否有特定的名称。假设你想在分组数据框中标记第n个事件的发生。 – theSage