代码之家  ›  专栏  ›  技术社区  ›  mexicanRmy

函数未捕获值的变化

  •  1
  • mexicanRmy  · 技术社区  · 1 年前

    我有以下数据帧:

    state_territory_code    week_nbr
     CA                     WEEK 49
     CA                     WEEK 49
     FL                     WEEK 49
     CA                     WEEK 50
     TN                     WEEK 50
     HI                     WEEK 50
     GA                     WEEK 51
     FL                     WEEK 51
    

    我主要尝试执行以下操作:

    • 如果迭代期间的当前周数不同于 next(如果更改)-然后取日期,添加7天,然后创建 新列。

    输出应为:

    state_territory_code    week_nbr          new_cal_date
         CA                     WEEK 49         01/01/2024
         CA                     WEEK 49         01/01/2024
         FL                     WEEK 49         01/01/2024
         CA                     WEEK 50         01/08/2024
         TN                     WEEK 50         01/08/2024
         HI                     WEEK 50         01/08/2024
         GA                     WEEK 51         01/15/2024
         FL                     WEEK 51         01/15/2024
    

    这是我的代码:

    def cal_week_start(some_df):
        start_dt = datetime.datetime(2024, 1, 1)
        
        for i, wk in enumerate(some_df):
            if i < (len(some_df)-1): ## Keep running as long as we haven't reached end of DF
                next_value = some_df[i+1] ## index pos of next value
                if wk != next_value: ## if value changes from one to the next do something
                    new_dt = start_dt + timedelta(days = 7) ## Add 7 days.
                    start_dt = new_dt ## reinitiate variable to add 7 days, 14, 21, etc.
                    return start_dt 
            else:
                return start_dt
    
    df_new['new_cal_date'] = df_new['week_nbr'].apply(cal_week_start)
    

    我知道它有点不稳定/不可靠,但我只需要它在大型数据集上执行。当我出于某种原因在函数外测试它时,它是有效的,不确定为什么它一直重复到2024年8月1日。如有任何帮助,我们将不胜感激。我还在学习。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Georgina Skibinski    1 年前

    我会稍微调整一下你的假设:

    >>> import datetime
    >>> start_dt = datetime.datetime(2024, 1, 1)
    >>> min_week = min(df.week_nbr.str.rsplit(" ").str[-1].astype(int))
    >>> df["new_cal_date"] = datetime.timedelta(days=7)*df.week_nbr.str.rsplit(" ").str[-1].astype(int).sub(min_week) + start_dt
    >>> df
      state_territory_code week_nbr new_cal_date
    0                   CA  WEEK 49   2024-01-01
    1                   CA  WEEK 49   2024-01-01
    2                   FL  WEEK 49   2024-01-01
    3                   CA  WEEK 50   2024-01-08
    4                   TN  WEEK 50   2024-01-08
    5                   HI  WEEK 50   2024-01-08
    6                   GA  WEEK 51   2024-01-15
    7                   FL  WEEK 51   2024-01-15
    

    解释 你可能是想根据迄今为止的数字绘制一周的地图,而不是依赖于订单(即使是给定的)。 使用矢量化计算也会更好, apply 通常较慢。 这里唯一需要注意的是,如果年份标记发生变化,但您可以通过分组/条件映射轻松缓解。