gpt4 book ai didi

python - 带字符串时间戳的平均聚合

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:41 25 4
gpt4 key购买 nike

我在数据库中有如下记录:

{
"_id" : ObjectId("592d4f43d69b643ac0cb9149"),
"timestamp" : "2017-03-01 17:09:00",
"Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]" : 0.0,
"Technique-Meteo_Précipitations_Precipitation status[]" : 0.0,
"Technique-Meteo_Direction du vent_Wind direction[]" : 0.0
}

{
"_id" : ObjectId("592d3a6cd69b643ac0cae395"),
"timestamp" : "2017-01-30 09:31:00",
"Technique-Electrique_Prises de Courant_Power1[W]" : 14.0,
"Technique-Electrique_Eclairage_Power2[W]" : 360.0,
"Technique-Electrique_Electroménager_Power3[W]" : 0.0,
"Technique-Electrique_VMC Aldes_Power4[W]" : 14.0,
"Technique-Electrique_VMC Unelvent_Power5[W]" : 8.0

我的时间戳是一个简单的字符串,由于其他算法的变化量很大,我不想碰它。不过,我想做一些平均操作。事实上,其他字段是传感器名称及其测量结果。我每分钟有一条记录,我想在一小时、一天或一个月内平均这些值。

就在之前,我创建了一个查询来计算一个字段每月现有值的数量

countExistingPerMonth = client[page1.currentDB][page2.currentColl].find({"$and":[{"timestamp":{"$regex": regexExpression}}, {chosenSensor:{"$exists": True}}]}, temp_doc).count()

我使用 $regex 表达式来查找与所选月份匹配的文档。

有什么办法可以使用这种方法来完成我的平均操作吗?

我尝试做一些事情(如下)。我还尝试使用正则表达式进行聚合,但这是不可能的。

self.sensorsStats = []
for chosenSensor in self.chosenSensors:
countPerMonth = []
years = []
incre_year = int(page5.combo_startYear.get())
if (incre_year<=int(page5.combo_endYear.get())):
while(incre_year!=(int(page5.combo_endYear.get())+1)):
years.append(str(incre_year))
incre_year += 1

for year in years:
for month in ["01","02","03","04","05","06","07","08","09","10","11","12"]:
regexExpression = '^'+year+'-'+month+'-..'

test = client[page1.currentDB][page2.currentColl].aggregate([{"$match":{"timestamp":{"$regex": regexExpression}}}, {"$group":{"_id":chosenSensor, "average":{"$avg":{chosenSensor}}}}])

最佳答案

实际上,您“应该”修复此处的时间戳字符串。但由于 ISO 字符串固有的“yyyy-dd-mm”格式,它们至少是按“词汇顺序”排列的。

因此,由于它们具有固定长度,因此我们实际上可以使用服务器端聚合的聚合框架对它们进行聚合。

对五月进行采样以进行日期选择:

cursor = client[page1.currentDB][page2.currentColl].aggregate([
{ "$match": {
"Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]":
{ "$exists": True },
"timestamp": {
"$gte": "2017-05-01 00:00:00", "$lt": "2017-06-01 00:00:00"
}
}},
{ "$group": {
"_id": {
"$substr": [ "$timestamp", 0, 10 ]
},
"average":
{ "$avg": "$Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]" }
}}
])

这将获得所选月份中每一天的“每天”总计。这依赖于字段的词汇值。相同的基本原则适用于这里的所有间隔。因此,您只需用零值填充字符串,直到您想要选择的间隔为止。

这里的“分组键”也是如此,其中 _id 的值应该类似地是直到所需间隔之前的子字符串。幸运的是,字符串格式是“零填充”,因此小于 "10" 的值前面会加一个零,如 "05" 中所示。这再次维护了“范围”的词汇顺序。

这就是您应该追求的目标,我认为您应该在此处选择字段,并为范围选择生成时间戳字符串。

但是您肯定可以通过 $group 获得一些东西在实际值的 [$substr][2] 部分上指示您所需的间隔,而不需要简单地为每个间隔迭代多个查询调用,只需让数据库为您完成即可。

然而,您的“键”是另一个问题,并且由于它们不一致,您似乎只能迭代可能的“键名称”并为所有键执行单独的聚合。您可以使语句更长,并使用 $ifNull 获取每个语句的“计数”和“总和”以确定何时增加。那么你会$divide “之后”$group管道阶段以获得最终的“平均值”。

最后一点有点复杂,不知道完整的范围,而且这并不完全在你的问题中。因此,我将把这个问题留给您自己解决,或者提出一个单独的问题。

N.B The $substr here is actually deprecated as of MongoDB 3.4. The replacement operators are $substrBytes and $substrCP. The operator used here is now considered an alias for $substrBytes, and they differ in Code Page treatment for the consideration of "length" as is documented. You should use appropriate to your Code Page, but chances are the "timestamp" is consistently in a single byte encoding anyway.

关于python - 带字符串时间戳的平均聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44694452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com