我有一個帶有時間索引(15 分鐘時間步長)的資料框df,其值代表閏年(2012 年)。考慮到下一個不是閏年和閏年的事實,目標是在未來幾年使用相同的df值。這意味著所有月份的值都必須相同,除了 2 月,它在 28 到 29 天之間變化。
我做了以下步驟:給定的是 2012 年的資料框 df
我分別創建了一個未來 10 年的資料范圍,從 2012 年開始,到 2022 年結束
我使用帶有以下代碼行的 pandas concat() 函式來復制 df 的值:
df_until_2022= pd.concat([df]*10, ignore_index=True)我使用 pandas join() 和 set_index() 函式來設定步驟 1 中的新資料范圍,并將未來 5 年作為索引。
現在的問題是行數取決于年份的型別(跳躍或不跳躍)
問題:如何自動檢查下一年的型別并根據該檢查資訊復制給定資料幀df的值?
uj5u.com熱心網友回復:
利用:
np.random.seed(2022)
i = pd.date_range('2012-01-01', '2012-12-31 23:45:00', freq='15Min')
df = pd.DataFrame({'a':np.random.rand(len(i))}, index=i)
想法是用最后一個時間戳添加新行,2022-12-31 23:45:00然后在這里創建15MinDatetimeindex DataFrame.asfreq,最后復制第一年的資料GroupBy.ffill:
df = pd.concat([df, df.iloc[[-1]].rename(lambda x: x.replace(year=2022))])
df1 = df.asfreq('15Min')
df1 = df1.groupby(df1.index.strftime('%M%d %H:%M:%S')).ffill()
print (df1)
a
2012-01-01 00:00:00 0.009359
2012-01-01 00:15:00 0.499058
2012-01-01 00:30:00 0.113384
2012-01-01 00:45:00 0.049974
2012-01-01 01:00:00 0.685408
...
2022-12-31 22:45:00 0.401750
2022-12-31 23:00:00 0.590506
2022-12-31 23:15:00 0.297647
2022-12-31 23:30:00 0.243992
2022-12-31 23:45:00 0.036991
[385728 rows x 1 columns]
另一種解決方案是創建所有日期DataFrame.reindex時間,然后在第二級加入省略前 4 年值的值,并通過to_datetimewith轉換為日期errors='coerce'時間 - 如果不存在,它將 29 日的日期時間替換為,所以最后通過inNaT洗掉此行:Index.notnaboolean indexing
np.random.seed(2022)
i = pd.date_range('2012-01-01', '2012-12-31 23:45:00', freq='15Min')
df = pd.DataFrame({'a':np.random.rand(len(i))}, index=i)
years = pd.MultiIndex.from_product([range(2012, 2023), df.index])
df1 = df.reindex(years, level=1)
df1.index = pd.to_datetime(df1.index.map(lambda x:f'{x[0]}{str(x[1])[4:]}'),errors='coerce')
df1 = df1[df1.index.notna()]
print (df1)
a
2012-01-01 00:00:00 0.009359
2012-01-01 00:15:00 0.499058
2012-01-01 00:30:00 0.113384
2012-01-01 00:45:00 0.049974
2012-01-01 01:00:00 0.685408
...
2022-12-31 22:45:00 0.401750
2022-12-31 23:00:00 0.590506
2022-12-31 23:15:00 0.297647
2022-12-31 23:30:00 0.243992
2022-12-31 23:45:00 0.036991
[385728 rows x 1 columns]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/516260.html
