Python 一年的平均每小时工作日概况,不包括周末和节假日

Python 一年的平均每小时工作日概况,不包括周末和节假日,python,pandas,time-series,Python,Pandas,Time Series,使用Pandas,我从导入的.csv文件创建了一个数据帧(该文件是通过模拟生成的)。数据框架由一年半小时的能源消耗数据组成。我已经为这些日期创建了DateTimeindex 我希望能够将这些数据重新格式化为每周平均小时数和周末概况结果。周配置文件不包括节假日 数据帧: Date_Time Equipment:Electricity:LGF Equipment:Electricity:GF 01/01/2000 00:30 0.583979872

使用Pandas,我从导入的.csv文件创建了一个数据帧(该文件是通过模拟生成的)。数据框架由一年半小时的能源消耗数据组成。我已经为这些日期创建了DateTimeindex

我希望能够将这些数据重新格式化为每周平均小时数和周末概况结果。周配置文件不包括节假日

数据帧:

Date_Time           Equipment:Electricity:LGF   Equipment:Electricity:GF
01/01/2000 00:30    0.583979872                 0.490327348
01/01/2000 01:00    0.583979872                 0.490327348
01/01/2000 01:30    0.583979872                 0.490327348
01/01/2000 02:00    0.583979872                 0.490327348
我找到了一个例子(),解释了几年来一直这样做,但没有明确说明一周(没有假期)和周末

我意识到在熊猫身上没有可以直接做到这一点的重采样技术,我使用了几个别名()来创建每月和每日的配置文件

我正在考虑使用工作日频率,创建一个新的工作日日期索引,并每半小时将其与我的DataFrame datetimeindex进行比较。然后返回工作日和周末的值(分别为true或false),以创建新的数据集,但不确定如何执行此操作

聚苯乙烯;我刚刚开始学习Python和Pandas。

虚拟数据(供将来参考,如果您以可复制粘贴的形式发布一些数据,则更有可能得到答案)

这里有一个方法。首先定义美国(或根据需要修改)工作日与假日的抵销,并生成涵盖日期的日期和范围

from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay
bday_us = CustomBusinessDay(calendar=USFederalHolidayCalendar())

bday_over_df = pd.date_range(start=df.index.min().date(), 
                             end=df.index.max().date(), freq=bday_us)
然后,开发两个分组列。一个小时专栏很容易

df['hour'] = df.index.hour
对于工作日/周末/假日,定义一个函数以对数据进行分组

def group_day(date):
    if date.weekday() in [5,6]:
        return 'weekend'
    elif date.date() in bday_over_df:
        return 'weekday'
    else:
        return 'holiday'

df['day_group'] = df.index.map(group_day)
然后,按照您的意愿将两列分组

In [140]: df.groupby(['day_group', 'hour']).sum()
Out[140]: 
                       a
day_group hour          
holiday   0     1.890621
          1    -0.029606
          2     0.255001
          3     2.837000
          4    -1.787479
          5     0.644113
          6     0.407966
          7    -1.798526
          8    -0.620614
          9    -0.567195
          10   -0.822207
          11   -2.675911
          12    0.940091
          13   -1.601885
          14    1.575595
          15    1.500558
          16   -2.512962
          17   -1.677603
          18    0.072809
          19   -1.406939
          20    2.474293
          21   -1.142061
          22   -0.059231
          23   -0.040455
weekday   0     9.192131
          1     2.759302
          2     8.379552
          3    -1.189508
          4     3.796635
          5     3.471802
...                  ...
          18   -5.217554
          19    3.294072
          20   -7.461023
          21    8.793223
          22    4.096128
          23   -0.198943
weekend   0    -2.774550
          1     0.461285
          2     1.522363
          3     4.312562
          4     0.793290
          5     2.078327
          6    -4.523184
          7    -0.051341
          8     0.887956
          9     2.112092
          10   -2.727364
          11    2.006966
          12    7.401570
          13   -1.958666
          14    1.139436
          15   -1.418326
          16   -2.353082
          17   -1.381131
          18   -0.568536
          19   -5.198472
          20   -3.405137
          21   -0.596813
          22    1.747980
          23   -6.341053

[72 rows x 1 columns]

谢谢!这很有效。因为我需要半小时数据,所以我添加了df['half_hour']=df.index.minute并通过df['combined']=df.apply(lambda x:'%02d:%02d'(x['hour',x['half_hour',])、axis=1将其组合到一个组合列表中,然后在groupby中使用组合列表。
In [140]: df.groupby(['day_group', 'hour']).sum()
Out[140]: 
                       a
day_group hour          
holiday   0     1.890621
          1    -0.029606
          2     0.255001
          3     2.837000
          4    -1.787479
          5     0.644113
          6     0.407966
          7    -1.798526
          8    -0.620614
          9    -0.567195
          10   -0.822207
          11   -2.675911
          12    0.940091
          13   -1.601885
          14    1.575595
          15    1.500558
          16   -2.512962
          17   -1.677603
          18    0.072809
          19   -1.406939
          20    2.474293
          21   -1.142061
          22   -0.059231
          23   -0.040455
weekday   0     9.192131
          1     2.759302
          2     8.379552
          3    -1.189508
          4     3.796635
          5     3.471802
...                  ...
          18   -5.217554
          19    3.294072
          20   -7.461023
          21    8.793223
          22    4.096128
          23   -0.198943
weekend   0    -2.774550
          1     0.461285
          2     1.522363
          3     4.312562
          4     0.793290
          5     2.078327
          6    -4.523184
          7    -0.051341
          8     0.887956
          9     2.112092
          10   -2.727364
          11    2.006966
          12    7.401570
          13   -1.958666
          14    1.139436
          15   -1.418326
          16   -2.353082
          17   -1.381131
          18   -0.568536
          19   -5.198472
          20   -3.405137
          21   -0.596813
          22    1.747980
          23   -6.341053

[72 rows x 1 columns]