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

