【问题标题】:Python Pandas: Change value associated with each first day entry in every monthPython Pandas:更改与每个月的每个第一天条目相关的值
【发布时间】:2017-12-17 13:48:26
【问题描述】:

我想将与每个月的第一天关联的值更改为 pandas.Series 我有。例如,给定如下内容:

Date
1984-01-03    0.992701
1984-01-04    1.003614
1984-01-17    0.994647
1984-01-18    1.007440
1984-01-27    1.006097
1984-01-30    0.991546
1984-01-31    1.002928
1984-02-01    1.009894
1984-02-02    0.996608
1984-02-03    0.996595
                ...

我想更改与1984-01-031984-02-01 等关联的值。我已经在这个问题上绞尽脑汁了好几个小时,并且环顾了 Stack Overflow 周围。一些解决方案已经接近。例如,使用:

[In]: series.groupby((m_ret.index.year, m_ret.index.month)).first()

[Out]:

Date  Date
1984  1       0.992701
      2       1.009894
      3       1.005963
      4       0.997899
      5       1.000342
      6       0.995429
      7       0.994620
      8       1.019377
      9       0.993209
      10      1.000992
      11      1.009786
      12      0.999069
1985  1       0.981220
      2       1.011928
      3       0.993042
      4       1.015153
                ...

快到了,但我正在努力继续前进。

我想做的是将与每年每个月的第一天相关的值设置为 1。

series[m_ret.index.is_month_start] = 1 接近,但这里的问题是is_month_start 只选择日期值为 1 的行。但是在我的系列中,情况并非总是如此,如您所见。比如一月第一天的日期是1984-01-03

series.groupby(pd.TimeGrouper('BM')).nth(0) 似乎也没有返回第一天,而是我得到了最后一天:

Date
1984-01-31    0.992701
1984-02-29    1.009894
1984-03-30    1.005963
1984-04-30    0.997899
1984-05-31    1.000342
1984-06-29    0.995429
1984-07-31    0.994620
1984-08-31    1.019377
                ...

我完全被难住了。一如既往,非常感谢您的帮助!谢谢。

【问题讨论】:

    标签: python pandas datetime dataframe


    【解决方案1】:

    一种方法是使用您的.groupby((m_ret.index.year, m_ret.index.month)) 想法,但在转换为系列的索引本身上使用idxmin

    In [74]: s.index.to_series().groupby([s.index.year, s.index.month]).idxmin()
    Out[74]: 
    Date  Date
    1984  1      1984-01-03
          2      1984-02-01
    Name: Date, dtype: datetime64[ns]
    
    In [75]: start = s.index.to_series().groupby([s.index.year, s.index.month]).idxmin()
    
    In [76]: s.loc[start] = 999
    
    In [77]: s
    Out[77]: 
    Date
    1984-01-03    999.000000
    1984-01-04      1.003614
    1984-01-17      0.994647
    1984-01-18      1.007440
    1984-01-27      1.006097
    1984-01-30      0.991546
    1984-01-31      1.002928
    1984-02-01    999.000000
    1984-02-02      0.996608
    1984-02-03      0.996595
    dtype: float64
    

    【讨论】:

    • 这似乎奏效了,谢谢!出于好奇,有没有更有效/更快的方法来做到这一点?并不是说我需要它来完成这项任务,更多的是为了我的一般理解。
    • @Bango 请考虑对这个答案进行投票。谢谢stackoverflow.com/help/someone-answers
    • s.index.to_series().groupby(pd.TimeGrouper('M')).min()
    • @piRSquared 感谢您提供替代代码,并投票赞成 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多