使用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。
答案 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]