【问题标题】:Subsetting columns of months by season in pandas DataFrame在 pandas DataFrame 中按季节对月份的列进行子集
【发布时间】:2020-08-28 19:31:13
【问题描述】:

我有一组从 Excel 工作表中提取的数据。其中一列是日期,所以我使用df.to_datetime() 重新格式化数据。我的数据只有每个月的第一天,字符串格式是:

“20190101”

所以只有 12 个日期。

然后我使用 pd.pivot 将这一列日期设为列标签。 现在的计划是按季节对列进行子集化(例如,一月、二月、十二月是冬季)。我只有 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() 可能是个好主意,但我不知道日期时间对象是否可行。

附:如果我的问题形成得不好或者我不明白你的答案,请原谅我。对熊猫来说相当陌生。

更新:我希望根据月份将 DataFrame 分成三个,三个时间段如下: 冬季:1月、2月、12月 轻载:三月、四月、五月 夏季:六月、七月、八月、九月

【问题讨论】:

  • 正如您所说的 12 月、1 月、2 月,我假设您想要北半球的季节?为什么不采用确切的日期而不是月份,因为冬季从 12 月 21 日开始?
  • 这个问题好像有答案了:stackoverflow.com/questions/16139306/…

标签: python pandas dataframe python-datetime


【解决方案1】:

根据您的描述,这达到了您想要的效果

  1. 将一个季度归类为一个季节
  2. “pivots”实际上转换为列格式

更新

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

【讨论】:

  • 就我而言,这是因为我运行 df = pd.DataFrame({'Date':['20180624', '20180924', '20181225']})df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d') #, format='%Y%m%d' 时的错误季节。
  • 你的数据集对我来说也是错误的......pandas.pydata.org/pandas-docs/stable/reference/api/… 说这个季度。当我将20180101 插入您的列表时,它就正确了。提供了一种不同的方法来计算季度......非常奇怪!
  • 很抱歉,这对我不起作用,因为我不在典型的季节工作。我用数据来分析我所在地区的用电量,三个时间段如下:冬季:1月,2月,12月,轻载:3月,4月,5月,夏季:6月,7月,8月,9月跨度>
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 2021-09-05
  • 2018-07-03
  • 2016-03-20
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
相关资源
最近更新 更多