如何在时序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
相关产品推荐
相关产品推荐

