Realisticamente, você "deveria" corrigir as strings de carimbo de data/hora aqui. Mas eles estão pelo menos em "ordem lexical" devido ao formato "aaaa-dd-mm" inerente às Strings ISO.
Portanto, como eles têm um comprimento fixo, podemos agregá-los usando a estrutura de agregação para uma agregação do lado do servidor.
Amostragem do mês de maio para seleção de data:
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[]" }
}}
])
Isso obteria o total "por dia" para cada dia no mês selecionado. Isso depende do valor léxico dos campos. O mesmo princípio básico se aplica a todos os intervalos aqui. Então você simplesmente preenche as strings com os valores zero até o intervalo que deseja a seleção.
O mesmo vale para a "chave de agrupamento" aqui, onde o valor para
_id
deve ser da mesma forma a substring até o intervalo necessário. Felizmente, o formato da string é "preenchido com zero", portanto, valores menores que "10"
são precedidos por um zero como em "05"
. Novamente, isso mantém a ordem lexical para "intervalos". É isso que você deve buscar, e presumo que você deva selecionar seus campos aqui, bem como gerar as strings de carimbo de data/hora para a seleção de intervalo.
Mas você certamente pode ganhar algo sendo capaz de
$group
no [$substr][2]
parte do valor real para indicar o intervalo necessário e não precisar iterar várias invocações de consulta simplesmente para cada intervalo e apenas deixar o banco de dados fazer isso por você. Suas "chaves", no entanto, são outro problema e, como não são consistentes, você parece preso à iteração pelos possíveis "nomes de chave" e à execução de uma agregação separada para todos eles. Você poderia tornar a declaração mais longa e obter as "contagens" e "somas" para cada um usando
$ifNull
para determinar quando incrementar. Então você $divide
"depois" do $group
etapa de pipeline para obter a "média" final. Essa última parte é um pouco complicada sem conhecer o escopo completo e não está totalmente na sua pergunta. Então, vou deixar isso para você resolver, ou fazer uma pergunta separada sobre.