pandas - 根据时间范围设置熊猫值
问题描述
我想将所有值设置为某个值(例如 999),这些值在某个阈值(例如 7)的任何值的某个时间段(例如 1 小时)内发生。我对不稳定的非矢量化方法有一些运气,但必须有一种更好的、pandastic 的方法来做到这一点......
一个例子是:
设置随机数据框:
hr_rng = pd.date_range(start='7/1/2014 00:00:00', end='7/1/2014 10:00:00', freq='H')
df = pd.DataFrame(hr_rng, columns=['date_time'])
df.set_index(pd.DatetimeIndex(df['date_time']),inplace=True)
df['val0']=np.random.randint(1, 10, df.shape[0])
随机输出:
date_time val0
date_time
2014-07-01 00:00:00 2014-07-01 00:00:00 4
2014-07-01 01:00:00 2014-07-01 01:00:00 8
2014-07-01 02:00:00 2014-07-01 02:00:00 4
2014-07-01 03:00:00 2014-07-01 03:00:00 7
2014-07-01 04:00:00 2014-07-01 04:00:00 2
2014-07-01 05:00:00 2014-07-01 05:00:00 4
2014-07-01 06:00:00 2014-07-01 06:00:00 4
2014-07-01 07:00:00 2014-07-01 07:00:00 9
2014-07-01 08:00:00 2014-07-01 08:00:00 1
2014-07-01 09:00:00 2014-07-01 09:00:00 9
2014-07-01 10:00:00 2014-07-01 10:00:00 5
我想得到的是:
date_time val0
date_time
2014-07-01 00:00:00 2014-07-01 00:00:00 999
2014-07-01 01:00:00 2014-07-01 01:00:00 999
2014-07-01 02:00:00 2014-07-01 02:00:00 999
2014-07-01 03:00:00 2014-07-01 03:00:00 7
2014-07-01 04:00:00 2014-07-01 04:00:00 2
2014-07-01 05:00:00 2014-07-01 05:00:00 4
2014-07-01 06:00:00 2014-07-01 06:00:00 999
2014-07-01 07:00:00 2014-07-01 07:00:00 999
2014-07-01 08:00:00 2014-07-01 08:00:00 999
2014-07-01 09:00:00 2014-07-01 09:00:00 999
2014-07-01 10:00:00 2014-07-01 10:00:00 999
另一个随机示例:
date_time val0
date_time
2014-07-01 00:00:00 2014-07-01 00:00:00 5
2014-07-01 01:00:00 2014-07-01 01:00:00 6
2014-07-01 02:00:00 2014-07-01 02:00:00 3
2014-07-01 03:00:00 2014-07-01 03:00:00 2
2014-07-01 04:00:00 2014-07-01 04:00:00 9
2014-07-01 05:00:00 2014-07-01 05:00:00 7
2014-07-01 06:00:00 2014-07-01 06:00:00 6
2014-07-01 07:00:00 2014-07-01 07:00:00 8
2014-07-01 08:00:00 2014-07-01 08:00:00 6
2014-07-01 09:00:00 2014-07-01 09:00:00 7
2014-07-01 10:00:00 2014-07-01 10:00:00 3
应该变成这样:
date_time val0
date_time
2014-07-01 00:00:00 2014-07-01 00:00:00 5
2014-07-01 01:00:00 2014-07-01 01:00:00 6
2014-07-01 02:00:00 2014-07-01 02:00:00 3
2014-07-01 03:00:00 2014-07-01 03:00:00 999
2014-07-01 04:00:00 2014-07-01 04:00:00 999
2014-07-01 05:00:00 2014-07-01 05:00:00 999
2014-07-01 06:00:00 2014-07-01 06:00:00 999
2014-07-01 07:00:00 2014-07-01 07:00:00 999
2014-07-01 08:00:00 2014-07-01 08:00:00 999
2014-07-01 09:00:00 2014-07-01 09:00:00 999
2014-07-01 10:00:00 2014-07-01 10:00:00 999
解决方案
这是一种方法,IIUC:
import pandas as pd
import numpy as np
np.random.seed(42)
hr_rng = pd.date_range(start='7/1/2014 00:00:00',
end='7/1/2014 10:00:00',
freq='H')
df = pd.DataFrame(hr_rng, columns=['date_time'])
df.set_index(pd.DatetimeIndex(df['date_time']),inplace=True)
df['val0']=np.random.randint(1, 10, df.shape[0])
现在,更新等于或大于阈值的行。
threshold = 7
# initialize
df['test'] = df['val0']
mask = df['val0'] >= threshold
df.loc[mask, 'test'] = 999
print(df.head())
date_time val0 test
date_time
2014-07-01 00:00:00 2014-07-01 00:00:00 7 999
2014-07-01 01:00:00 2014-07-01 01:00:00 4 4
2014-07-01 02:00:00 2014-07-01 02:00:00 8 999
2014-07-01 03:00:00 2014-07-01 03:00:00 5 5
2014-07-01 04:00:00 2014-07-01 04:00:00 7 999
您的问题是关于查找和更新选定的值吗?或者将观察结果放入一小时的桶中?
推荐阅读
- c++ - 使用 BLAS 和 OpenMP 优化特征重构(矩阵 - 对角矩阵 - 矩阵)乘积 C++
- javascript - React styled-component 不传递道具
- sql - MS SQL Server 2008 查询 - 没有得到正确的发送和接收消息计数
- c# - SonarQube - 仅在方法中用作局部变量的私有字段应成为局部变量
- arrays - 简单但特定的数组编译错误(C)
- google-apps-script - Google Apps 脚本 setFormula 函数
- c# - 更改控制台应用程序写入行标题
- android - 使用 Android 中另一个片段的 EditText 填充微调器
- powershell - pipeline和foreach什么时候创造价值?
- android - Flutter - 如何使用多个 ChangeNotifierProvider 的