我需要按学期对数据进行分组,但没有可用的频率标签 here
2QS
(从开始起 2 个季度)和 6MS
(从开始起 6 个月)不会这样做,因为它们将根据第一个日期时间在不同的时刻开始我的数据框。 (非常违反直觉并且容易出错,恕我直言:我没有看到这个问题,直到我使用了从五月而不是一月开始的不同数据集......)
from datetime import *
import pandas as pd
import numpy as np
df = pd.DataFrame()
days = pd.date_range(start="2017-05-17",
end="2017-11-29",
freq="1D")
df = pd.DataFrame({'DTIME': days, 'DATA': np.random.randint(50, high=80, size=len(days))})
df.set_index('DTIME', inplace=True)
grouped = df.groupby(pd.Grouper(freq='2QS'))
print("Groups date start:")
for dtime, group in grouped:
print dtime
# print(group)
返回
Groups date start:
2017-04-01 00:00:00 <== because my first datetime is in May, 2017
2017-10-01 00:00:00
而不是:
Groups date start:
2017-01-01 00:00:00 <== I want the semesters referred to the year!
2017-06-01 00:00:00
作为一种可能的解决方法,我在数据框中创建了两个新列,然后根据它们进行分组:
df["year"] = df.index.year.astype(int)
df["semester"] = df.index.month.astype(int)
df["semester"] = df["semester"] - 1
df["semester"] = df["semester"] // 6
grouped = df.groupby(["year", "semester"])
这是唯一的方法吗?
还有另外两个小问题,只是出于好奇,不值得一个独立的 stackoverflow 问题:
为什么标签
W
(周末)可用,但WS
(每周开始)不可用?如何将其写在一行中?
df["semester"] = df.index.month.astype(int) df["semester"] = df["semester"] - 1 df["semester"] = df["semester"] // 6
最佳答案
最接近的是 anchored-offsets
,但一个月不见了。
第二个:
df["semester"] = (df.index.month.astype(int) - 1) // 6
或者不创建新列:
years = df.index.year.astype(int)
semes = (df.index.month.astype(int) - 1) // 6
grouped = df.groupby([years, semes])
关于python - Pandas groupby : group by semester,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51854809/