我需要按学期对数据进行分组,但是没有可用的频率标签here
根据我数据框中的第一个日期时间, 2QS
(从开始起2个季度)和6MS
(从开始起6个月)将不起作用,因为它们将在不同的时刻开始。 (非常违反直觉并且容易出错,恕我直言:直到使用从5月开始而不是1月开始的其他数据集,我才看到这个问题。)
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
答案 0 :(得分:1)
最接近的是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])