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

如何在pandas DataFrame中过滤删除2月29日的闰年观测数据

问题修复方案

1. 核心错误原因

  • 删除2月29日的逻辑错误:原代码(day!=29) & (month!=2)要求两个条件同时满足,等于直接删除了整个2月的所有数据,完全不符合需求
  • 即便正确删除了2月29日,闰年的dayofyear(年积日)从3月1日起仍会比平年多1,直接pivot仍会生成366列,无法对齐平年的365天序列

2. 修正后完整代码

首先修正2月29日的过滤逻辑:

import pandas as pd
import requests
from datetime import date

params = {"sid": "PHLthr", "sdate":"1900-12-31", "edate":"2020-12-31", "elems": [{"name": "maxt", "interval": "dly",  "duration": "dly", "prec": 6}]}
baseurl = "http://data.rcc-acis.org/StnData"
#get the data
resp = requests.post(baseurl, json=params)
#package into the dataframe
df = pd.DataFrame(columns=['date', 'tmax'], data=resp.json()['data'])
#convert the date column to datetimes
df['date']=pd.to_datetime(df['date'])
#select years
mask = (df['date'] >= '1900-01-01') & (df['date'] <= '1940-12-31')
Baseline=df.loc[mask]
# 正确删除所有2月29日的记录,保留其他日期
Baseline = Baseline.loc[ ~( (Baseline['date'].dt.month == 2) & (Baseline['date'].dt.day == 29) ) ]

再调整年积日对齐逻辑,保证所有年份的日期序号统一为平年的1-365序列:

# 生成日度数据
daily = pd.DataFrame(data={'date':Baseline.date,'tmax':Baseline.tmax})
# 判断对应年份是否为闰年
daily['is_leap'] = daily['date'].dt.is_leap_year
# 提取原始年积日
daily['day'] = daily['date'].dt.dayofyear
# 调整闰年3月及之后的年积日,全部减1对齐平年序列
daily.loc[ (daily['is_leap']) & (daily['date'].dt.month >=3), 'day' ] = daily['day'] -1
# 提取年份
daily['year'] = daily['date'].dt.year
# 重塑为年行日列的结构,此时列数固定为365
result_df = daily.pivot(index='year', columns='day', values='tmax')

3. 验证方式

执行如下代码确认列数符合要求:

print(result_df.shape[1]) # 输出应为365

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:15:03