除周末日和假日外的平均每小时一周的个人资料

时间:2014-07-21 11:16:06

标签: python pandas time-series

使用Pandas我已经从导入的.csv文件创建了一个DataFrame(该文件是通过模拟生成的)。 DataFrame包含一年半小时的能耗数据。我已经为日期创建了一个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

我找到了一个例子(Getting the average of a certain hour on weekdays over several years in a pandas dataframe),它解释了这样做了几年,但没有明确表示一周(没有假期)和周末。

我意识到Pandas中没有直接执行此操作的重采样技术,我使用了几个别名(http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases)来创建每月和每日配置文件。

我正在考虑使用营业日频率并创建一个带工作日的新dateindex,并将其与我的DataFrame datetimeindex进行比较,每半小时一次。然后返回工作日和周末天的值,分别为true或false,以创建新数据集,但不知道如何执行此操作。

PS;我刚刚进入Python和Pandas。

1 个答案:

答案 0 :(得分:1)

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

df = pd.DataFrame(data={'a':np.random.randn(1000)}, 
        index=pd.date_range(start='2000-01-01', periods=1000, freq='30T'))

这是一种方法。首先定义一个美国(或适当修改)假日的营业日抵消,并生成和覆盖您的日期范围。

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]