熊猫分组方式:按学期分组

时间:2018-08-15 07:47:44

标签: python pandas pandas-groupby

我需要按学期对数据进行分组,但是没有可用的频率标签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问题:

  1. 为什么标签W(一周结束)可用,而WS(一周开始)不可用?

  2. 如何用一行写出来?

      df["semester"] = df.index.month.astype(int)
      df["semester"] = df["semester"] - 1
      df["semester"] = df["semester"] // 6
    

1 个答案:

答案 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])