【问题标题】:Pandas: Calculate average of values for a time frame熊猫:计算时间范围内的平均值
【发布时间】:2019-11-09 23:10:11
【问题描述】:

我正在处理一个看起来像这样的大型数据集:

Time,   Value
01.01.2018 00:00:00.000,  5.1398
01.01.2018 00:01:00.000,  5.1298
01.01.2018 00:02:00.000,  5.1438
01.01.2018 00:03:00.000,  5.1228
01.01.2018 00:04:00.000,  5.1168
.... , ,,,,
31.12.2018 23:59:59.000,  6.3498

数据是从一年中的first 到一年中的lastminute 数据

我想使用Pandas 来查找每5 天的平均值。

例如:

01.01.2018 00:00:00.00005.01.2018 23:59:59.000 的平均值是05.01.2018 的平均值

下一个平均值将从02.01.2018 00:00:00.0006.01.2018 23:59:59.00006.01.2018 的平均值

下一个平均值将从03.01.2018 00:00:00.0007.01.2018 23:59:59.00007.01.2018 的平均值

等等...我们将 day 增加 1,但计算从当天到过去 5 天的平均值,包括当前日期。

对于给定的一天,有 24 小时 * 60 分钟 = 1440 个数据点。所以我需要得到 1440 个数据点 * 5 天 = 7200 个数据点的平均值。

最终的 DataFrame 将如下所示,时间格式 [DD.MM.YYYY](没有 hh:mm:ss),Value 是包括当前日期在内的 5 个数据的平均值:

Time,   Value
05.01.2018,  5.1398
06.01.2018,  5.1298
07.01.2018,  5.1438
.... , ,,,,
31.12.2018,  6.3498

底线是计算从今天到过去5天的数据平均值,平均值如上所示。

我尝试遍历 Python 循环,但我想要的东西比 Pandas 做得更好。

【问题讨论】:

  • @Valentino 该解决方案不起作用,因为我最终想要的解决方案不同。 duplicate 的答案会为下一个 15s 计算,但我想要的是为接下来的 5 天计算。我们不会像问题中所述跳过一天。
  • @Alexander - 好问题。前 4 个数据将是 NAN,因为没有要取平均值的数字,因为我们正在做 5 个数字平均。
  • 对不起,你是对的,不是那个副本

标签: python python-3.x pandas


【解决方案1】:

也许这会起作用?

import numpy as np

# Create one year of random data spaced evenly in 1 minute intervals.
np.random.seed(0)  # So that others can reproduce the same result given the random numbers.
time_idx = pd.date_range(start='2018-01-01', end='2018-12-31', freq='min')
df = pd.DataFrame({'Time': time_idx, 'Value': abs(np.random.randn(len(time_idx))) + 5})

>>> df.shape
(524161, 2)

鉴于数据帧的间隔为 1 分钟,您可以取过去五天的滚动平均值(5 天 * 24 小时/天 * 60 分钟/小时 = 7200 分钟)并将结果分配给名为 @987654323 的新列@。然后,您可以使用 dt 访问器方法对原始时间戳进行分组以获取日期,然后获取每个日期的最后一个 rolling_5d_avg 值。

df = (
    df
    .assign(rolling_5d_avg=df.rolling(window=5*24*60)['Value'].mean())
    .groupby(df['Time'].dt.date)['rolling_5d_avg']
    .last()
)

>>> df.head(10)
Time
2018-01-01         NaN
2018-01-02         NaN
2018-01-03         NaN
2018-01-04         NaN
2018-01-05    5.786603
2018-01-06    5.784011
2018-01-07    5.790133
2018-01-08    5.786967
2018-01-09    5.789944
2018-01-10    5.789299
Name: rolling_5d_avg, dtype: float64

【讨论】:

  • 您是否为此导入了NumPynp.random.seed(0)?您能否通过其他措辞细节进一步澄清一下。谢谢!
  • 嗯....df['Value'].head(5 * 24 * 60).mean().round(6) 的结果是 5.786603,与 1 月 5 日的第一个数字匹配。您指的是哪个平均值?
  • 在您的数据中,还是在我上面创建的示例数据中?如果是前者,请检查以确保您没有丢失数据点(df['Time'].diff().max() 应该导致Timedelta('0 days 00:01:00'))。如果是后者,请将种子重置为 0 并复制上面的代码以确保获得相同的结果。
  • 这个解决方案应该完全按照您在上面的评论中描述的那样做。
猜你喜欢
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2019-11-24
  • 2022-01-11
  • 2016-05-05
  • 2015-01-12
相关资源
最近更新 更多