将Pandas每日时间步长转换为每年52周时间步,最后一周为8天

时间:2018-01-20 01:40:12

标签: python pandas datetime group-by pandas-groupby

我有一个Pandas数据帧,其索引为每日时间步长如下:

oldman.head()

         Value
date              
1992-01-01  1080.4
1992-01-02  1080.4
1992-01-03  1080.4
1992-01-04  1080.0
1992-01-05  1079.6
...

从1992-01-01开始到2016-12-31。我想提取每年的每周平均值。但是,我的周应该是特别的方式。一年有52周,有365天,但上周为8天!第一周应该从每年的1月1日开始。

我想知道我应该如何从每日时间步数据中提取这样的周数。

谢谢,

1 个答案:

答案 0 :(得分:2)

我在上周修改了COLDSPEED的解决方案,为8天。值得注意的是,在闰年的最后一周"周"实际上是9天。以下示例仅在您包含所有年份时才有效。原因是我的函数假设groupby中的最后一行实际上是一年中的最后一周。

#make some data
df = pd.DataFrame(index=pd.date_range("1992-1-1","1992-12-31"))
df["value"] = 1

#add a counting variable
df["count"] = 1
df = df.groupby(pd.Grouper(freq='Y'))\
  .resample('7D')\
  .sum()\
  .reset_index(level=0, drop=True)\

def chop_last_week(df):
    df1=df.copy()
    df1.iloc[-2] += df1.iloc[-1]
    return df1.iloc[:-1]

df = df.groupby(df.index.year)\
        .apply(chop_last_week)\
        .reset_index(level=0, drop=True)
df["mean"] = df["value"]/df["count"]
df.tail(5)

它不是最干净的解决方案,但它运行得很快。