簡體   English   中英

在 Pandas DataFrame 中按季節對月份列進行子集化

[英]Subsetting columns of months by season in pandas DataFrame

我有一組從 Excel 工作表中提取的數據。 其中一列是日期,因此我使用df.to_datetime()重新格式化數據。 我的數據是每個月的第一天,字符串格式是:

“20190101”

所以只有12個日期。

然后我使用 pd.pivot 將這一列日期作為列標簽。 現在的計划是按季節對列進行子集化(例如,Jan、Feb、Dec 是冬季)。 我只有 2019 年的數據,但我將在未來幾年使用此代碼。 我將參加去年的 12 月,所以我需要忽略這些年。

如何根據月份對列進行子集化。 換句話說,我想將 DataFrame 划分為類似於:

for column in full_df.iterrows()
    If (column_label.datetime.month = 01 | column_label.datetime.month = 02 |column_label.datetime.month = 12):
        winter_df[datetime.month] = full_df[column_label]

我知道 for 循環在 Dataframe 中不受歡迎,並且我知道我可以通過將其保留為字符串並輸入特定字符串來對其進行硬編碼,但是數據不會每次都來自同一年,我將不得不進行調整每年的代碼。 如何為列標簽執行 if 語句? df.filter()可能是個好主意,但我不知道它是否可能與 datetime 對象一起使用。

PS如果我的問題形成不當或我不明白你的答案,請原諒我。 對熊貓來說相當陌生。

更新:我希望根據月份將 DataFrame 分成三個,三個時間段如下: 冬季:一月、二月、十二月 輕載:三月、四月、五月 夏季:六月、七月 八月、九月

根據您的描述,這實現了您想要的

  1. 將季分為四分之一
  2. “樞軸”實際上轉置為列格式

更新

似乎有一種條件, pandas可以給出錯誤的季度。 可以改為從月份的整數除法計算

df = df.assign(season=lambda x: x["Date"].apply(lambda s: ["winter","spring","summer","autumn"][(s.month-1)//3]))

import datetime as dt
import pandas as pd
import random
df = pd.DataFrame([{"Date":d, "Value": random.randint(10,20)} 
 for d in pd.date_range(dt.datetime(2018,1,1),dt.datetime(2019,3,1), freq="MS")])

df = df.assign(season=lambda x: x["Date"].apply(lambda s: ["winter","spring","summer","autumn"][s.quarter-1]))
df = df.set_index(["season","Date"]).T

輸出

season     winter                           spring                           summer                           autumn                           winter                      
Date   2018-01-01 2018-02-01 2018-03-01 2018-04-01 2018-05-01 2018-06-01 2018-07-01 2018-08-01 2018-09-01 2018-10-01 2018-11-01 2018-12-01 2019-01-01 2019-02-01 2019-03-01
Value          10         20         12         17         12         12         11         20         11         19         12         10         11         20         14

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM