You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从doylist DataFrame提取跨年度指定范围的日序(DOY)序列?

解决方案

错误原因

range() 函数要求传入整数参数,但你直接把整个dyofyr列(Series对象)传进去了,自然会触发TypeError——Series是一组值的集合,不是单个整数,没法被range()解析。

实现方法

要实现跨年度的日序序列生成,需要对每个日序值单独处理,同时解决跨年时的日序循环问题(比如日序47往前60天会落到上一年的352)。

方法1:用apply()逐行处理

先定义一个处理单个日序的函数,再用apply()把函数作用到dyofyr列的每个元素上:

def generate_doy_sequence(doy):
    # 计算起始和结束日序
    start_doy = doy - 60
    end_doy = doy + 19
    
    if start_doy <= 0:
        # 跨年情况:拼接上一年的剩余日序和当年的日序
        last_year_part = range(365 + start_doy, 366)  # range左闭右开,所以结束值设为366
        current_year_part = range(1, end_doy + 1)
        return list(last_year_part) + list(current_year_part)
    else:
        # 非跨年情况:直接生成连续序列
        return list(range(start_doy, end_doy + 1))

# 给DataFrame新增一列存储序列
doylist['target_doy_sequence'] = doylist['dyofyr'].apply(generate_doy_sequence)

测试日序47时,会生成352-365 + 1-66的序列(如果需要到67,把end_doy = doy + 19改成end_doy = doy + 20即可)。

方法2:矢量化处理(适合大数据量)

如果你的DataFrame行数很多,用numpy的矢量化操作会比apply()更高效:

import numpy as np

def generate_doy_sequence_vec(doy_series):
    start_list = doy_series - 60
    end_list = doy_series + 19
    result = []
    
    for s, e in zip(start_list, end_list):
        if s <= 0:
            part1 = np.arange(365 + s, 366)
            part2 = np.arange(1, e + 1)
            result.append(np.concatenate([part1, part2]).tolist())
        else:
            result.append(np.arange(s, e + 1).tolist())
    
    return result

doylist['target_doy_sequence'] = generate_doy_sequence_vec(doylist['dyofyr'])

注意事项

  • 如果需要支持闰年,把代码中的365替换为366即可,或者根据年份动态判断天数(比如结合年份列判断是否为闰年)。
  • 序列的闭合区间可以根据需求调整range或arange的结束值,确保包含你需要的最后一个日序。

内容的提问来源于stack exchange,提问作者user2100039

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:36:30