【问题标题】:Set value based on day in month in pandas timeseries在熊猫时间序列中根据月份中的日期设置值
【发布时间】:2017-01-22 09:48:21
【问题描述】:

我有一个时间序列

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 的系列中。

我尝试创建两个系列,第一个 (series1),第 9 设置为 1,然后 series1.shift(1) * series2 它在月中有效,但如果将 day 设置为 1,则由于上个月的最后一个日期在 series1 中设置为 0,因此无效。

【问题讨论】:

  • 通常情况下,每篇文章有一个问题会有所帮助,如果您尝试解决问题时获得预期输出,我们将不胜感激。
  • 好的!我将编辑帖子,使其仅包含一个问题。

标签: python date pandas


【解决方案1】:

假设您的时间序列是 s 并带有 datetimeindex

我想创建一个包含天数大于或等于9 的所有索引值的groupby 对象。

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,因为它也满足此要求。

【讨论】:

  • 这很聪明!
  • @piRSquared,你见过this question - 我试图找到一个矢量化解决方案但失败了。我认为这很有挑战性...... ;-)
  • @MaxU 我没见过。当我几分钟后就要离开时,这会让我在开车时考虑一些事情。我会试一试,谢谢与我分享。
猜你喜欢
  • 2015-07-31
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 2021-12-03
  • 2019-08-21
  • 1970-01-01
  • 2020-11-26
  • 2021-07-29
相关资源
最近更新 更多