我有 1901-1940 年的每日溫度資料。我想排除閏年,即洗掉落在 2/29 的任何溫度資料。我的資料目前是一個長陣列。我正在重塑它,以便每一年都是一行,每一列都是一天。我試圖用這里的最后一行代碼洗掉閏年:
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]
#get rid of leap years:
Baseline=Baseline.loc[(Baseline['date'].dt.day!=29) & (Baseline['date'].dt.month!=2)]
但是當我重塑陣列時,我注意到有 366 列而不是 365 列,所以我認為我實際上并沒有擺脫 2 月 29 日的資料。我將如何完全消除在整個資料集中記錄在 2/29 的任何溫度資料。我每年只想要 365 個資料點。
daily=pd.DataFrame(data={'date':Baseline.date,'tmax':Baseline.tmax})
daily['day']=daily.date.dt.dayofyear
daily['year']=daily.date.dt.year
daily.pivot(index='year', columns='day', values='tmax')
uj5u.com熱心網友回復:
您的問題的根源是您使用了daily.date.dt.dayofyear。
一年中的每一天,包括2 月 29 日,都有自己的編號。
更糟糕的是,例如Mar 1有dayofyear:
- 閏年61,
- 非閏年60。
一種可能的解決方案是將日期列設定為月份和日期的字串表示形式。為了在透視表中提供適當的排序,月份部分應該放在第一位。
因此,在將date列轉換為datetime 后,要創建兩個附加列,請運行:
daily['year'] = daily.date.dt.year
daily['day'] = daily.date.dt.strftime('%m-%d')
然后你可以過濾掉2 月 29 日并一次性生成資料透視表:
result = daily[daily.day != '02-29'].pivot(index='year', columns='day',
values='tmax')
對于一些有限的源資料樣本,除了你的,我得到:
day 02-27 02-28 03-01 03-02
year
2020 11 10 14 15
2021 11 21 22 24
替代
創建3 個額外的列:
daily['year'] = daily.date.dt.year
daily['month'] = daily.date.dt.strftime('%m')
daily['day'] = daily.date.dt.strftime('%d')
注意月份和日期的字串表示,以保持前導零。
然后過濾掉2 月 29 日并 在列上生成帶有MulitiIndex的資料透視表:
result = daily[(daily.month != '02') | (daily.day != '29')].pivot(
index='year', columns=['month', 'day'], values='tmax')
這次的結果是:
month 02 03
day 27 28 01 02
year
2020 11 10 14 15
2021 11 21 22 24
uj5u.com熱心網友回復:
簡單的方法是在構建陣列之前消除這些專案。
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)
vals = resp.json()
rows = [row for row in vals['data'] if '02-29' not in row[0]]
print(rows)
uj5u.com熱心網友回復:
由于使用了 366 列dayofyear。這將根據實際日歷計算日期(即不洗掉 2 月 29 日)。
要看到這個:
>>> daily.iloc[1154:1157]
date tmax day year
1154 1904-02-28 38.000000 59 1904
1156 1904-03-01 39.000000 61 1904
1157 1904-03-02 37.000000 62 1904
請注意,這一天從 59 到 61(第 60 天是 1904 年 2 月 29 日)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/349885.html
