python-3.x - pandas/numpy - 基于时间的平均值
问题描述
我有一些基本上是日期时间戳和值的数据,例如:
01-01-2021 11:40:01, 1.0532
01-01-2021 11:40:02, 1.0531
...
01-01-2021 11:41:01, 1.0541
01-01-2021 11:41:01, 1.0542
有很多数据。我想知道是否有办法让 pandas 或 numpy 快速计算时间增量(例如 1 秒、5 秒、1 分钟、5 分钟等)的平均值。
我知道有一些函数可以计算多个点的平均值,但它是我需要的时间增量,即 1 秒平均值、5 秒平均值、1 分钟平均值等。
谢谢
标记
解决方案
让我们首先获取一些看起来像您描述的随机数据:
>>> df = pd.DataFrame({
... 'datetime': pd.date_range(pd.Timestamp.today(), periods=2048, freq='300ms'),
... 'value': np.random.randint(0, 100, 2048) / 200 + 1
... })
如果您datetime
是字符串而不是实际日期时间,则应先转换它们:
>>> df['datetime'] = pd.to_datetime(df['datetime'])
然后,您可以使用pd.Grouper
来实现您想要的。例如每秒:
>>> df.groupby(pd.Grouper(key='datetime', freq='1s'))['value'].mean()
datetime
2021-09-27 11:07:15 1.190000
2021-09-27 11:07:16 1.180000
2021-09-27 11:07:17 1.141250
2021-09-27 11:07:18 1.285000
2021-09-27 11:07:19 1.190000
...
2021-09-27 11:17:25 1.255000
2021-09-27 11:17:26 1.305000
2021-09-27 11:17:27 1.150000
2021-09-27 11:17:28 1.258333
2021-09-27 11:17:29 1.312500
Freq: S, Name: value, Length: 615, dtype: float64
每 5 秒:
>>> df.groupby(pd.Grouper(key='datetime', freq='5s'))['value'].mean()
datetime
2021-09-27 11:07:15 1.194286
2021-09-27 11:07:20 1.267647
2021-09-27 11:07:25 1.305000
2021-09-27 11:07:30 1.223125
2021-09-27 11:07:35 1.255294
...
2021-09-27 11:17:05 1.280882
2021-09-27 11:17:10 1.225294
2021-09-27 11:17:15 1.329687
2021-09-27 11:17:20 1.278235
2021-09-27 11:17:25 1.262353
Freq: 5S, Name: value, Length: 123, dtype: float64
等等,参见频率表达式的参考。
另请注意,您的平均值可能并不总是在每个单位时间内具有相同数量的值:
>>> df.groupby(pd.Grouper(key='datetime', freq='1s'))['value'].count()
datetime
2021-09-27 11:07:15 1
2021-09-27 11:07:16 3
2021-09-27 11:07:17 4
2021-09-27 11:07:18 3
2021-09-27 11:07:19 3
..
2021-09-27 11:17:25 3
2021-09-27 11:17:26 4
2021-09-27 11:17:27 3
2021-09-27 11:17:28 3
2021-09-27 11:17:29 4
Freq: S, Name: value, Length: 615, dtype: int64
推荐阅读
- java - 使用 Jackson 忽略空字段和空字段/数组
- java - 使具有相同名称的新 ArrayList 表现不同
- python - 芹菜定期任务不在 Django 中运行
- mysql - 如何连接来自不同数据库的Rails中的两个表
- c++ - 使用 Microsoft Embedded Visual C++ 进行远程调试
- qt - 为什么加载时会触发动画
- java - Google Sheet API 更新令牌?
- python - 为什么 os.symlink 使用相对于目标的路径?
- ruby-on-rails - 弹性搜索结果没有搜索单词之间的空间
- canvas - 从桌面到移动的画布图像不同大小(以像素为单位)