根据pandas timeseries

时间:2017-01-22 09:48:22

标签: python date pandas

我有时间序列

date    
2009-12-23    0.0
2009-12-28    0.0
2009-12-29    0.0
2009-12-30    0.0
2009-12-31    0.0
2010-01-04    0.0
2010-01-05    0.0
2010-01-06    0.0
2010-01-07    0.0
2010-01-08    0.0
2010-01-11    0.0
2010-01-12    0.0
2010-01-13    0.0
2010-01-14    0.0
2010-01-15    0.0
2010-01-18    0.0
2010-01-19    0.0
2010-01-20    0.0
2010-01-21    0.0
2010-01-22    0.0
2010-01-25    0.0
2010-01-26    0.0
2010-01-27    0.0
2010-01-28    0.0
2010-01-29    0.0
2010-02-01    0.0
2010-02-02    0.0

我想根据以下规则将值设置为1:

  • 如果常数设置为9,则表示每月的第9天。由于 那个2010-01-09不存在我想设置下一个日期 存在于上述2010-01-11的系列中。

我试图用day<创建两个系列之一(series1) 9设置为1和1(系列2),日期> 9到1然后series1.shift(1) * series2 它适用于月中,但如果将day设置为1则不会,因为上一个月的最后一个日期在series1中设置为0。

1 个答案:

答案 0 :(得分:3)

假设您的时间序列为s且日期时间指数

我想创建一个groupby个对象,其中包含日期大于或等于9的所有索引值。

g = s.index.to_series().dt.day.ge(9).groupby(pd.TimeGrouper('M'))

然后我会检查至少有一天>= 9并抓住其中的第一天。有了这些,我将赋值为1。

s.loc[g.idxmax()[g.any()]] = 1
s

date
2009-12-23    1.0
2009-12-28    0.0
2009-12-29    0.0
2009-12-30    0.0
2009-12-31    0.0
2010-01-04    0.0
2010-01-05    0.0
2010-01-06    0.0
2010-01-07    0.0
2010-01-08    0.0
2010-01-11    1.0
2010-01-12    0.0
2010-01-13    0.0
2010-01-14    0.0
2010-01-15    0.0
2010-01-18    0.0
2010-01-19    0.0
2010-01-20    0.0
2010-01-21    0.0
2010-01-22    0.0
2010-01-25    0.0
2010-01-26    0.0
2010-01-27    0.0
2010-01-28    0.0
2010-01-29    0.0
2010-02-01    0.0
2010-02-02    0.0
Name: val, dtype: float64

请注意,2009-12-23也被分配了1,因为它也符合此要求。