问题描述
我有一组从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()
可能是个好主意,但我不知道日期时间对象是否可行。
P.S。如果我对问题的理解不佳,或者我不明白您的答案,请原谅我。对熊猫来说还很新。
更新:我希望根据月份将DataFrame分为三个,这三个时间段如下: 冬季:1月,2月,12月 轻载:3月,4月,5月 夏季:六月,七月,八月,九月
解决方法
从您的描述中可以实现您想要的
- 将一个季度分为四分之一
- “枢轴”实际上转置为列格式
更新
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,freq="MS")])
df = df.assign(season=lambda x: x["Date"].apply(lambda s: ["winter","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