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

如何在时序Pandas DataFrame中按季节为日期标注标签?

自定义季节标签标注Pandas DataFrame

需求说明

现有包含datetime和values列的Pandas DataFrame,需新增Label列,按照以下自定义季节规则标注(格式如Autumn1、Winter1):

  • Winter1:2019年12月、2020年1-2月
  • Spring1:2020年3-5月
  • Summer1:2020年6-8月
  • Autumn1:2020年9-11月
  • Winter2:2020年12月、2021年1-2月
  • Spring2:2021年3-5月
  • Summer2:2021年6-8月
    数据集时间范围为2019年9月至2021年8月。

原尝试代码仅按月份映射季节,未结合年份区分跨年度冬季,且未生成目标格式的Label列,无法满足需求,原代码如下:

# mapping months to seasons: 1- winter, 2-spring, 3-summer, 4-autumn 
if seasons:
    seasons = {1: 1, 2: 1, 3: 2, 4: 2, 5:2, 6:3, 7:3, 8:3, 9:4, 10:4, 11:4, 12:1} # maps months to seasons: 
    df['season'] = df['month'].map(seasons, na_action=None)
    df['winter'] = np.where(df['season'] == 1, True, False)
    df['spring'] = np.where(df['season'] == 2, True, False)
    df['summer'] = np.where(df['season'] == 3, True, False)
    df['autumn'] = np.where(df['season'] == 4, True, False)
    df['transitionperiod'] = np.where((df['season'] == 2) | (df['season'] == 4), True, False)

解决方案

步骤1:确保datetime列格式正确

如果datetime列不是datetime类型,先转换:

df['datetime'] = pd.to_datetime(df['datetime'])

步骤2:生成季节Label列

结合年份和月份,使用np.select批量判断每个时间点对应的季节标签,逻辑清晰且效率较高:

import numpy as np
import pandas as pd

# 定义条件和对应的标签
conditions = [
    # Autumn1:2019年9-11月
    (df['datetime'].dt.year == 2019) & (df['datetime'].dt.month.isin([9,10,11])),
    # Winter1:2019年12月、2020年1-2月
    ((df['datetime'].dt.year == 2019) & (df['datetime'].dt.month == 12)) | 
    ((df['datetime'].dt.year == 2020) & (df['datetime'].dt.month.isin([1,2]))),
    # Spring1:2020年3-5月
    (df['datetime'].dt.year == 2020) & (df['datetime'].dt.month.isin([3,4,5])),
    # Summer1:2020年6-8月
    (df['datetime'].dt.year == 2020) & (df['datetime'].dt.month.isin([6,7,8])),
    # Autumn2:2020年9-11月
    (df['datetime'].dt.year == 2020) & (df['datetime'].dt.month.isin([9,10,11])),
    # Winter2:2020年12月、2021年1-2月
    ((df['datetime'].dt.year == 2020) & (df['datetime'].dt.month == 12)) | 
    ((df['datetime'].dt.year == 2021) & (df['datetime'].dt.month.isin([1,2]))),
    # Spring2:2021年3-5月
    (df['datetime'].dt.year == 2021) & (df['datetime'].dt.month.isin([3,4,5])),
    # Summer2:2021年6-8月
    (df['datetime'].dt.year == 2021) & (df['datetime'].dt.month.isin([6,7,8]))
]

labels = [
    'Autumn1',
    'Winter1',
    'Spring1',
    'Summer1',
    'Autumn2',
    'Winter2',
    'Spring2',
    'Summer2'
]

# 生成Label列
df['Label'] = np.select(conditions, labels, default='Unknown')

代码说明

  • 每个条件明确结合年份和月份,精准匹配跨年度的冬季区间,解决原代码只按月份判断的问题
  • np.select会按顺序匹配条件,匹配到第一个符合的条件后就对应赋值标签,确保逻辑准确
  • 如果有超出时间范围的记录,会被标注为Unknown,可根据需求调整默认值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:13:25