【发布时间】:2017-09-24 16:11:18
【问题描述】:
我有一个包含日期时间类型列和浮点类型列的数据框。
日期值 0 2010-01-01 01:23:00 21.2 1 2010-01-02 01:33:00 63.4 2 2010-01-03 06:02:00 80.6 3 2010-01-04 06:05:00 50.1 4 2010-01-05 06:20:00 346.5 5 2010-01-06 07:44:00 111.8 6 2010-01-07 08:00:00 113.1 7 2010-01-08 08:22:00 10.6 8 2010-01-09 09:00:00 287.2 9 2010-01-10 09:14:00 1652.6我想创建一个新列来记录当前迭代行时间前一小时的平均值。
[更新]示例:
如果当前迭代是 4 2010-01-05 06:20:00 346.5 ,我需要计算 (50.1 + 80.6) / 2 (范围内的值 2010-01-05 05:20:00~2010-01-05 06:20:00 并计算平均值)。
我使用iterrows() 来解决这个问题,如下面的代码。但是这种方法真的很慢,而且函数iterrows()在pandas中通常不推荐使用,这行会变成as
[更新]
df['before_1hr_mean'] = np.nan
for index, row in df.iterrows():
df.loc[index, 'before_1hr_mean'] = df[(df['date'] < row['date']) & \
(df['date'] >= row['date'] - pd.Timedelta(hours=1))]['value'].mean()
有没有更好的方法来处理这种情况?
【问题讨论】:
-
您是否意识到您的示例按天递增...这意味着结果与您的原始数据相同。在这个例子中,我们取一行的平均值。
-
另外,您的代码显示
df['date'] <= row['date']暗示您希望将当前行的值包含在平均值中。但是您的示例计算排除了当前行的值。这也意味着您的第一行的计算将为空。 -
对不起我的错误代码。我把等号放在错误的位置。从您的代码中学到很多东西,在这种情况下 null 或 Nan 是可以的。
标签: python pandas datetime time-series