Wen 提出的解决方案只要来源日期/时间来自
单一测量日。
如果源包含来自不同天的读数,则 resample 的结果
对于每个区域,从第一天最早的读数到最晚的读数
最后一天的阅读,包括中间夜间时间,什么是
可能不是你想要的。
此解决方案的另一个缺点是它不提供“零”读数
从测量日的一开始,但从最早的读数开始。
这同样适用于“最终”阅读,也不一定在结尾
测量日。
我的解决方案没有这些缺点,基于以下假设:
- 保留源日期 列,因为以后需要。
日期时间计算后,只删除小时列。
- 生成 df_borders DataFrame,其中包含 NaN 读数,用于开始/结束
测量日期,对于每个区域和日期,我假设为 07:00:00 和 13:00:00。
- 将上述 NaN 读数添加到主 DataFrame 并删除每个的重复项
区域 / 日期时间。这样,每个区域/天的源数据包含
每天的确切开始/结束的读数,无论是原始的还是添加的
df_borders.
- 为避免“非工作日”读数,必须在
['区域','日期']。这就是为什么我将 date 栏留到现在。
- 现在 date 列不再需要,可以删除。
- 最后一步是打印结果。
下面是示例程序:
import pandas as pd
df = pd.read_csv('Input.csv')
# Generate df_borders - NaN readings for start / end of each area / date
df_start = df[['area','date']].drop_duplicates()
df_end = df_start.copy()
df_start['hour'] = '07:00:00'
df_end['hour'] = '13:00:00'
df_borders = pd.concat([df_start,df_end])
# Compute Datetime column and drop hour column, for both DataFrames
df['Datetime'] = pd.to_datetime(df.date + ' ' + df.hour)
df.drop('hour', inplace=True, axis = 1)
df_borders['Datetime'] = pd.to_datetime(df_borders.date + ' ' + df_borders.hour)
df_borders.drop('hour', inplace=True, axis = 1)
# Add NaN readings
df = df.append(df_borders, sort=False, ignore_index=True)\
.drop_duplicates(subset=['area', 'Datetime'])
# Generate the full set of readings
df = df.groupby(['area', 'date'])\
.apply(lambda x : x.set_index('Datetime').resample('H').mean().fillna(0))\
.reset_index()
df.drop('date', inplace=True, axis = 1)
# Result
print(df)
有些部分是文的解决方案的副本,以避免重新发明轮子。
对于源数据:
area,date,hour,output
H1,2018-07-01,07:00:00,150
H1,2018-07-01,08:00:00,120
H1,2018-07-01,09:00:00,90
H1,2018-07-01,11:00:00,130
H2,2018-07-01,09:00:00,110
H2,2018-07-01,10:00:00,50
H2,2018-07-01,11:00:00,80
H2,2018-07-01,12:00:00,110
H2,2018-07-02,08:00:00,40
H2,2018-07-02,09:00:00,65
H2,2018-07-02,11:00:00,95
H2,2018-07-02,12:00:00,45
打印出来:
area Datetime output
0 H1 2018-07-01 07:00:00 150.0
1 H1 2018-07-01 08:00:00 120.0
2 H1 2018-07-01 09:00:00 90.0
3 H1 2018-07-01 10:00:00 0.0
4 H1 2018-07-01 11:00:00 130.0
5 H1 2018-07-01 12:00:00 0.0
6 H1 2018-07-01 13:00:00 0.0
7 H2 2018-07-01 07:00:00 0.0
8 H2 2018-07-01 08:00:00 0.0
9 H2 2018-07-01 09:00:00 110.0
10 H2 2018-07-01 10:00:00 50.0
11 H2 2018-07-01 11:00:00 80.0
12 H2 2018-07-01 12:00:00 110.0
13 H2 2018-07-01 13:00:00 0.0
14 H2 2018-07-02 07:00:00 0.0
15 H2 2018-07-02 08:00:00 40.0
16 H2 2018-07-02 09:00:00 65.0
17 H2 2018-07-02 10:00:00 0.0
18 H2 2018-07-02 11:00:00 95.0
19 H2 2018-07-02 12:00:00 45.0
20 H2 2018-07-02 13:00:00 0.0
根据需要,一系列 7 个读数,用于 3 个区域/日期对。