在日期之间更改pandas系列中的值

时间:2016-06-14 12:00:57

标签: python numpy pandas scipy

我有一个pandas Series(),其日常条目都设置为False:

d = pd.Series(False, pd.bdate_range("20100101", periods=100, freq="D"))

我现在想要将每个月的第15和第20之间的值设置为True。我生成一个系列,其索引是开始/结束日期和值True:

s = pd.Series(True, pd.bdate_range("20100101", periods=100, freq="MS") + pd.DateOffset(14))
e = pd.Series(True, pd.bdate_range("20100101", periods=100, freq="MS") + pd.DateOffset(19))

此时se将包含 s tart和 e nd日期,在此日期之间我要设置{ {1}}为真。我不确定如何优雅地将其应用于d

这个问题的一个复杂因素是s和e是随机的(即它并不总是一个月的15-20天):

d

2 个答案:

答案 0 :(得分:2)

您可以使用between,但首先需要使用DatetimeIndex.day创建Serie

print (pd.Series(d.index.day, index=d.index).between(15,20))
2010-01-01    False
2010-01-02    False
2010-01-03    False
2010-01-04    False
2010-01-05    False
2010-01-06    False
2010-01-07    False
2010-01-08    False
2010-01-09    False
2010-01-10    False
2010-01-11    False
2010-01-12    False
2010-01-13    False
2010-01-14    False
2010-01-15     True
2010-01-16     True
2010-01-17     True
2010-01-18     True
2010-01-19     True
2010-01-20     True
2010-01-21    False
2010-01-22    False
2010-01-23    False
2010-01-24    False
2010-01-25    False
2010-01-26    False
2010-01-27    False
2010-01-28    False
2010-01-29    False
2010-01-30    False

2010-03-12    False
2010-03-13    False
2010-03-14    False
2010-03-15     True
2010-03-16     True
2010-03-17     True
2010-03-18     True
2010-03-19     True
2010-03-20     True
2010-03-21    False
2010-03-22    False
2010-03-23    False
2010-03-24    False
2010-03-25    False
2010-03-26    False
2010-03-27    False
2010-03-28    False
2010-03-29    False
2010-03-30    False
2010-03-31    False
2010-04-01    False
2010-04-02    False
2010-04-03    False
2010-04-04    False
2010-04-05    False
2010-04-06    False
2010-04-07    False
2010-04-08    False
2010-04-09    False
2010-04-10    False
Freq: D, dtype: bool

答案 1 :(得分:2)

使用现有的pd.Series,您可以通过.day的{​​{1}}属性使用boolean indexing,或使用DateTimeIndex达到同样的效果:

np.in1d

导致:

d[(d.index.day >= 15) & (d.index.day <= 20)] = True

d[np.in1d(d.index.day, np.arange(15, 20))] = True