【问题标题】:pandas grooup by according to group of days of the weekpandas 根据一周中的几天分组
【发布时间】:2022-01-19 17:48:36
【问题描述】:

我有这个数据框:

2018-01-01 01:00:00   3.479
2018-01-01 02:00:00   3.477
2018-01-01 03:00:00   3.475
2018-01-01 04:00:00   3.472
2018-01-01 05:00:00   3.470
                    ...
2018-01-07 20:00:00   3.149
2018-01-07 21:00:00   3.147
2018-01-07 22:00:00   3.145
2018-01-07 23:00:00   3.143
2018-01-08 00:00:00   3.141

我知道我可以将每日平均值计算为:

dfn = dfr.resample('D').mean()

但是,我想做一些不同的事情。我想计算每周前三天和最后第四天的平均值。一点说明:我不知道我的数据什么时候开始。

我尽量让自己清楚。这里的例子:

在图中,您可以看到我每天都有一个值(我的真实数据框有每小时值)。我想计算每一天的每组(周一、周二、周三)(周四、周五、周六、周日)的平均值。在这个例子中,我只有两天,所以我希望我的算法有四个值。

我觉得我可以应用与 groupby 相关的东西,但我无法设置解决方案。

欢迎提出任何建议。

谢谢

【问题讨论】:

  • 如果你有两个星期,为什么你会期望四个值?另外你不知道一周的开始是什么意思?
  • 什么意思: > 我不知道我的一周是从星期一还是星期三开始。可以举个例子吗?

标签: pandas datetime pandas-groupby weekday


【解决方案1】:

也许是这样的:

类似的数据框:

rng = pd.date_range(start='2018-01-01', end='2018-01-21')
rnd_values = np.random.rand(len(rng))+3

df = pd.DataFrame({'time':rng.to_list(),'value':rnd_values})

识别两个不同的跨度:

df['span'] = \
    np.where((df['time'].dt.day_of_week == 0) | (df['time'].dt.day_of_week >= 4), 'Th-Sn', 'Mn-Wd')

给每个跨度一个前缀标识符(我使用周数。跨度开始日期是另一种选择):

df['wkno'] = df['time'].dt.isocalendar().week.shift(fill_value=0) 

获取每个跨度的平均值:

df.groupby(['wkno','span']).mean()

               value
wkno span           
0    Th-Sn  3.916292
1    Mn-Wd  3.597244
     Th-Sn  3.794555
2    Mn-Wd  3.295676
     Th-Sn  3.478448
3    Mn-Wd  3.610433
     Th-Sn  3.455591

【讨论】:

  • 太棒了。但是,我使用 DateIndex。因此,我使用“dfr.index.dayofweek”。我希望这个选项是正确的。该算法似乎无法正常工作。事实上,我的第一天是 2018-01-01 01:00:00 a Monday 但我得到 dfr['span'] = Th-Sn
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多