【发布时间】:2020-04-12 16:38:39
【问题描述】:
生成数据
random.seed(42)
date_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')
df = pd.DataFrame(np.random.randint(0,10,size=(len(date_rng), 3)),
columns=['data1', 'data2', 'data3'],
index= date_rng)
daily_mean_df = pd.DataFrame(np.zeros([len(date_rng), 3]),
columns=['data1', 'data2', 'data3'],
index= date_rng)
mask = np.random.choice([1, 0], df.shape, p=[.35, .65]).astype(bool)
df[mask] = np.nan
# Data column to calculate each day
day = [['data1', 'data2'],
['data1', 'data2'],
['data2', 'data3'],
['data1', 'data3'],
['data2', 'data3'],
['data1', 'data2'],
['data2', 'data3'],
['data1', 'data3']]
我想每天选择数据,对于每一天,我将根据day 变量给出的某些列(每天不同)计算平均值。
预期结果:
mean
2018-01-01 00:00:00 1.0
2018-01-01 01:00:00 5.0
2018-01-01 02:00:00 2.0
2018-01-01 03:00:00 6.0
2018-01-01 04:00:00 5.5
... ...
2018-01-07 20:00:00 4.0
2018-01-07 21:00:00 7.0
2018-01-07 22:00:00 5.0
2018-01-07 23:00:00 NaN
2018-01-08 00:00:00 2.0
我知道我可以循环一天并通过以下方式计算:
i = 0
b = 0
for day_ in np.unique(test.index.date):
a = test[test.index.date == day_]
print(day_)
print(b, len(a))
daily_mean_df.iloc[b:b+len(a), 0] = np.mean(a[~np.isnan(a[day[i]])], axis = 1)
i += 1
b += len(a)
但是对于大型数据集,这种方法需要很长时间。 请建议我计算这个问题的有效方法。
【问题讨论】:
标签: python-3.x pandas time-series