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

如何在Pandas中对含跨年日序的两列数据进行排序

解决方案:自定义规则排序并填充缺失行

需求说明

现有一组按day_of_year和year记录的数据,每年day_of_year=1时切换至新年份。需要按以下规则处理:

  • 2017年仅保留并排序364、365日期的数据
  • 2018及以后年份按1、2、364、365的顺序排列数据
  • 排序完成后添加两行全为n/a的缺失数据

原始数据

day_of_year year    var_1
364 2017    17.71666667
364 2018    5.166666667
364 2019    2
364 2020    1.595833333
364 2021    3.75
364 2022    6.8875
365 2017    14.83333333
365 2018    2.758333333
365 2019    4.108333333
365 2020    5.766666667
365 2021    5.291666667
365 2022    10.58636364
1   2017    2.0125
1   2018    14.0125
1   2019    -0.504166667
1   2020    7.666666667
1   2021    5.520833333
1   2022    1.229166667
2   2017    1.7625
2   2018    15.10416667
2   2019    -0.391666667
2   2020    9.5
2   2021    7.645833333
2   2022    0.9125

目标结果

day_of_year year    var_1
364 2017    17.71666667
365 2017    14.83333333
1   2018    14.0125
2   2018    15.10416667
364 2018    5.166666667
365 2018    2.758333333
1   2019    -0.504166667
2   2019    -0.391666667
364 2019    2
365 2019    4.108333333
1   2020    7.666666667
2   2020    9.5
364 2020    1.595833333
365 2020    5.766666667
1   2021    5.520833333
2   2021    7.645833333
364 2021    3.75
365 2021    5.291666667
1   2022    1.229166667
2   2022    0.9125
364 2022    6.8875
365 2022    10.58636364
n/a n/a n/a
n/a n/a n/a

Python(Pandas)实现代码

步骤1:导入依赖并加载数据

import pandas as pd
from io import StringIO

# 读取原始数据
raw_data = """day_of_year year    var_1
364 2017    17.71666667
364 2018    5.166666667
364 2019    2
364 2020    1.595833333
364 2021    3.75
364 2022    6.8875
365 2017    14.83333333
365 2018    2.758333333
365 2019    4.108333333
365 2020    5.766666667
365 2021    5.291666667
365 2022    10.58636364
1   2017    2.0125
1   2018    14.0125
1   2019    -0.504166667
1   2020    7.666666667
1   2021    5.520833333
1   2022    1.229166667
2   2017    1.7625
2   2018    15.10416667
2   2019    -0.391666667
2   2020    9.5
2   2021    7.645833333
2   2022    0.9125"""

df = pd.read_csv(StringIO(raw_data), sep=r'\s+')

步骤2:筛选有效行并自定义排序

# 过滤2017年的1、2号数据
df_filtered = df[~((df['year'] == 2017) & (df['day_of_year'].isin([1,2])))]

# 生成排序键,控制年份内的日期顺序
def get_sort_key(row):
    if row['year'] == 2017:
        return (row['year'], row['day_of_year'])
    else:
        # 把1、2归为第一组,364、365归为第二组,实现指定顺序
        group = 0 if row['day_of_year'] in [1,2] else 1
        return (row['year'], group, row['day_of_year'])

# 按自定义键排序
df_sorted = df_filtered.sort_values(by=df_filtered.apply(get_sort_key, axis=1))

步骤3:添加缺失行并输出结果

# 创建两行n/a数据
na_rows = pd.DataFrame({
    'day_of_year': ['n/a', 'n/a'],
    'year': ['n/a', 'n/a'],
    'var_1': ['n/a', 'n/a']
})

# 合并数据
final_df = pd.concat([df_sorted, na_rows], ignore_index=True)

# 打印最终结果
print(final_df.to_string(index=False))

内容的提问来源于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 05:51:18