【问题标题】:Copying value based on earliest day of month of datetimeindex根据 datetimeindex 月份的最早日期复制值
【发布时间】:2021-02-14 23:08:46
【问题描述】:

我有一个带有 datetimeindex 和 Val 列的数据框。该值每天都在变化。

我想创建一个新列,该列将是该月最早一天的 Val 值。请注意,我没有说每月的“第一天”。索引中最早的一天可能是第 2 天、第 3 天、第 10 天等……那么这个值应该传播到下个月的最早一天。

在下面的示例中,对于 2020 年 1 月 2 日,我想要 1.764052,并且要持续到 2020 年 1 月 31 日。然后对于 2020-02-03,我想要 0.864436,这将持续到 3 月出现的第一个日期。

如果我们做不到那么远,即使是一个布尔掩码,只要告诉索引日期是否是本月最早的就足够了,我可以以某种方式对值列进行排序。提前致谢。

import numpy as np
import pandas as pd

np.random.seed(0)
rng = pd.date_range('2020-01-02', periods=27, freq='B')
df = pd.DataFrame({ 'Val' : np.random.randn(len(rng)) }, index=rng)
df['Want'] = 99
df

                Val  Want
2020-01-02  1.764052    1.764052    
2020-01-03  0.400157    1.764052    
2020-01-06  0.978738    1.764052    
2020-01-07  2.240893    1.764052    
2020-01-08  1.867558    1.764052    
2020-01-09 -0.977278    1.764052    
2020-01-10  0.950088    1.764052    
2020-01-13 -0.151357    1.764052    
2020-01-14 -0.103219    1.764052    
2020-01-15  0.410599    1.764052    
2020-01-16  0.144044    1.764052    
2020-01-17  1.454274    1.764052    
2020-01-20  0.761038    1.764052    
2020-01-21  0.121675    1.764052    
2020-01-22  0.443863    1.764052    
2020-01-23  0.333674    1.764052    
2020-01-24  1.494079    1.764052    
2020-01-27 -0.205158    1.764052    
2020-01-28  0.313068    1.764052    
2020-01-29 -0.854096    1.764052    
2020-01-30 -2.552990    1.764052    
2020-01-31  0.653619    1.764052    
2020-02-03  0.864436    0.864436    
2020-02-04 -0.742165    0.864436    
2020-02-05  2.269755    0.864436    
2020-02-06 -1.454366    0.864436    
2020-02-07  0.045759    0.864436    
​

【问题讨论】:

    标签: python pandas dataframe datetime


    【解决方案1】:
    • groupby() 在索引中
    • transform() 返回所有行
    • lambda 函数选择分组系列中的第一个值
    • 可以进一步简化为“first”
    import numpy as np
    np.random.seed(0)
    rng = pd.date_range('2020-01-02', periods=27, freq='B')
    df = pd.DataFrame({ 'Val' : np.random.randn(len(rng)) }, index=rng)
    df['Want'] = 99
    df["Want"] = df.groupby([df.index.year,df.index.month])["Val"].transform(lambda s: s[0])
    df
    
    Val Want
    2020-01-02 00:00:00 1.76405 1.76405
    2020-01-03 00:00:00 0.400157 1.76405
    2020-01-06 00:00:00 0.978738 1.76405
    2020-01-07 00:00:00 2.24089 1.76405
    2020-01-08 00:00:00 1.86756 1.76405
    2020-01-09 00:00:00 -0.977278 1.76405
    2020-01-10 00:00:00 0.950088 1.76405
    2020-01-13 00:00:00 -0.151357 1.76405
    2020-01-14 00:00:00 -0.103219 1.76405
    2020-01-15 00:00:00 0.410599 1.76405
    2020-01-16 00:00:00 0.144044 1.76405
    2020-01-17 00:00:00 1.45427 1.76405
    2020-01-20 00:00:00 0.761038 1.76405
    2020-01-21 00:00:00 0.121675 1.76405
    2020-01-22 00:00:00 0.443863 1.76405
    2020-01-23 00:00:00 0.333674 1.76405
    2020-01-24 00:00:00 1.49408 1.76405
    2020-01-27 00:00:00 -0.205158 1.76405
    2020-01-28 00:00:00 0.313068 1.76405
    2020-01-29 00:00:00 -0.854096 1.76405
    2020-01-30 00:00:00 -2.55299 1.76405
    2020-01-31 00:00:00 0.653619 1.76405
    2020-02-03 00:00:00 0.864436 0.864436
    2020-02-04 00:00:00 -0.742165 0.864436
    2020-02-05 00:00:00 2.26975 0.864436
    2020-02-06 00:00:00 -1.45437 0.864436
    2020-02-07 00:00:00 0.0457585 0.864436

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 2018-07-22
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多