Python 获取按1小时时间窗口分组的列的平均值

Python 获取按1小时时间窗口分组的列的平均值,python,pandas,dataframe,datetime,pandas-groupby,Python,Pandas,Dataframe,Datetime,Pandas Groupby,我有以下数据帧: 输入 df = pd.DataFrame( {'DeviceID' : ['358639059721158', '358639059721158', '358639059721158', '358639059721158', '358639059721158', '358639059721304', '358639059721304'], 'AssetSerialNo':['BKK-XYZ00005', 'BKK-XYZ00005', 'BKK-XYZ00005', 'BKK

我有以下数据帧:

输入

df = pd.DataFrame(
{'DeviceID' : ['358639059721158', '358639059721158', '358639059721158', '358639059721158', '358639059721158', '358639059721304', '358639059721304'],
 'AssetSerialNo':['BKK-XYZ00005', 'BKK-XYZ00005', 'BKK-XYZ00005', 'BKK-XYZ00005', 'BKK-XYZ00005', 'IST-XYZ00004', 'IST-XYZ00004'], 
 'Date' :['9/5/2018 6:00', '9/5/2018 6:01', '9/5/2018 6:59', '9/5/2018 7:04', '9/5/2018 8:54', '28/5/2018 23:40', '28/5/2018 23:59'],
 'ParameterValue': [0.475, 0.375, 0.175, 0.575, 0.115, 0.234, 0.575],
 'Tc': [-18.000000, -16.000000, -14.000000, -12.000000, -11.000000, -29.000000, -28.000000],
 'compressor': [0, 0, 1, 1, 1, 1, 1],
 'Ta': [31.784826, 32.784826, 33.784826, 43.784826, 23.784826, 54.784826, 31.784826],
 'label': [0, 0, 0, 1, 0, 0, 0],
 'FaultType_Rcap': [0, 0, 0, 0, 0, 0, 0],
 'FaultType_Rec': [0, 0, 0, 0, 0, 0, 0],
 'FaultType_Ri': [0, 0, 0, 0, 0, 0, 0],
 'FaultType_normal': [1, 1, 1, 1, 1, 1, 1]})
(如果要复制任务,请添加一个虚拟表)

如你所见,我有一个“日期”栏,每小时增加1分钟。尽管某些行可能不会每小时生成60行数据(1小时=60分钟)。这是设备id为“358639059721304”的情况,它在23:00-00:00之间只发送了两行

我想做的是按每个设备1小时的间隔对数据帧的行进行分组。例如,我想做如下的事情:

输出

df = pd.DataFrame(
{'DeviceID' : ['358639059721158', '358639059721158', '358639059721158', '358639059721158', '358639059721158', '358639059721304', '358639059721304'],
 'AssetSerialNo':['BKK-XYZ00005', 'BKK-XYZ00005', 'BKK-XYZ00005', 'BKK-XYZ00005', 'BKK-XYZ00005', 'IST-XYZ00004', 'IST-XYZ00004'], 
 'Date' :['9/5/2018 6:00', '9/5/2018 6:01', '9/5/2018 6:59', '9/5/2018 7:04', '9/5/2018 8:54', '28/5/2018 23:40', '28/5/2018 23:59'],
 'ParameterValue': [0.475, 0.375, 0.175, 0.575, 0.115, 0.234, 0.575],
 'Tc': [-18.000000, -16.000000, -14.000000, -12.000000, -11.000000, -29.000000, -28.000000],
 'compressor': [0, 0, 1, 1, 1, 1, 1],
 'Ta': [31.784826, 32.784826, 33.784826, 43.784826, 23.784826, 54.784826, 31.784826],
 'label': [0, 0, 0, 1, 0, 0, 0],
 'FaultType_Rcap': [0, 0, 0, 0, 0, 0, 0],
 'FaultType_Rec': [0, 0, 0, 0, 0, 0, 0],
 'FaultType_Ri': [0, 0, 0, 0, 0, 0, 0],
 'FaultType_normal': [1, 1, 1, 1, 1, 1, 1]})

|设备ID |资产序列号|日期|参数值| Tc |压缩机| Ta |标签|故障类型| Rcap |故障类型| Rcond |故障类型|记录|故障类型| Ri |故障类型|正常|
|-----------------|---------------|-----------------|-----------------------|--------------------------------------|------------|-----------------------------------|-------|----------------|-----------------|---------------|--------------|------------------|
|358639059721158 | BKK-XYZ00005 | 9/5/2018 6:00 |(0.475+0.325+0.525)/3 |(-18.000000+-16.720951+-11.720951)/3 |(0+0+1)/3 |(24.742001+20.742001+35.742001)/3 | 1 | 0 ||
|358639059721158-BKK-XYZ00005-9/5/2018 7:04 |(0.225 | 0.105)/2 |(0.720951+-22.720951)/2 |(1+1)/2 |(5.742001+15.742001)/2 | 1 | 0 | 0 | 1|
|358639059721304 IST-XYZ00004 | 28/5/2018 23:40 |(0.127544+0.097544)/2 |(11.720951+-15.288659)/2 |(0+0)/2 |(31.742001+11.742001)/2 | 1 | 0 | 0 | 1|
因此,输出按1小时的间隔对数据进行分组,并找到其余列的平均值。我的目标是减少数据样本。总的来说,1000000行要少得多,按每个设备1小时对数据进行分组。我希望您使用pandas DataFrame对此进行思考,尽管我也希望使用PySpark。但解决方案是第一位的

我当前的方法(未完成)

提前感谢您的帮助和建议。

您可能想试试


是的。该行将日期序列转换为日期时间。如果你的列是datetime类型,你可以跳过它。好了,它成功了!虽然花了一些时间。所以我试着想象如果1000000行需要1分钟,想象100000000行需要多少时间。对于Spark数据帧,您是否有类似的方法,或者如何优化执行此命令所需的时间?
df['Date'] = pd.to_datetime(df.Date)
df.groupby(['DeviceID','AssetSerialNo', pd.Grouper(key = 'Date', freq = '60min')]).agg('mean')