| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- from datetime import datetime
- import pymongo
- import pandas as pd
- from urllib import parse
- import requests
- import os
- import sys
- import django
- BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- sys.path.append(BASE_DIR)
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bigdataAPI.settings')
- django.setup()
- from apps.PestAnalysis.models import EnvTempHum, HeNanAddr
- def bigata_mongo():
- user = parse.quote_plus("root")
- passwd = parse.quote_plus("yfkj@6020")
- myclient = pymongo.MongoClient("mongodb://{0}:{1}@8.136.98.49:57017/".format(user,passwd))
- return myclient
- def device_aggrate():
- myclient = bigata_mongo()
- mydb = myclient.smartfarming
- mycol = mydb.sa_device
- query = [
- {
- "$match": {
- "province": "河南省",
- "device_type_id": 15
- }
- },
- {
- "$group": {
- "_id": {
- "province": "$province",
- "city": "$city",
- "district": "$district"
- },
- "device_ids": { "$addToSet": "$device_id" },
- "unique_count": { "$sum": 1 }
- }
- },
- {
- "$project": {
- "location": "$_id",
- "device_ids": 1,
- "unique_count": 1,
- "_id": 0
- }
- }
- ]
- result = mycol.aggregate(query)
- # for i in list(result):
- # device_ids = i.get("device_ids")
- # count = i.get("unique_count")
- # location = i.get("location")
- # print("地址:", location, "数量", count)
- myclient.close()
- return list(result)
- def nd_qxz_data(device_ids, start, end):
- myclient = bigata_mongo()
- mydb = myclient.smartfarming
- mycol = mydb.sa_nd_qxz_data
- query = {
- "upl_time": {
- "$gte": start,
- "$lte": end
- },
- "device_id": {
- "$in": device_ids
- }
- }
- project = {
- "_id": 0,
- "temp": 1,
- "swc": 1
- }
- nd_data = mycol.find(query,project)
- myclient.close()
- nd_data = list(nd_data)
- tmp_list = {}
- if nd_data:
- for k in nd_data:
- temp = k.get("temp")
- swc = k.get("swc")
- if temp:
- temp = temp.split(",")
- for index, ti in enumerate(temp):
- try:
- ti = float(ti)
- except:
- ti = 0
- if "temp_" + str(index) in tmp_list:
- tmp_list["temp_" + str(index)].append(ti)
- else:
- tmp_list["temp_" + str(index)] = [ti]
- if swc:
- swc = swc.split(",")
- for index, si in enumerate(swc):
- try:
- si = float(si)
- except:
- si = 0
- if "swc_" + str(index) in tmp_list:
- tmp_list["swc_" + str(index)].append(si)
- else:
- tmp_list["swc_" + str(index)] = [si]
- avg_data = {}
- for k, v in tmp_list.items():
- avg_data[k] = round(sum(v) / len(v), 2)
- return avg_data
- def main(start_y, end_y):
- start_year = datetime(start_y, 1, 1, 0, 0, 0).timestamp()
- end_year = datetime(end_y, 1, 1, 0, 0, 0).timestamp()
- device_addr = device_aggrate()
- for i in device_addr:
- device_ids = i.get("device_ids")
- location = i.get("location")
- province = location.get("province")
- city = location.get("city")
- district = location.get("district")
- print(district)
- henan = HeNanAddr.objects.filter(province=province, city=city, district=district)
- if henan.exists():
- henan = henan.first()
- addr_code = henan.code
- if addr_code:
- # 时间
- for r in range(int(start_year), int(end_year), 86400):
- data = nd_qxz_data(device_ids, r, r + 86400)
- format_date = datetime.fromtimestamp(r).strftime("%Y-%m-%d")
- for k, v in data.items():
- if k.startswith("temp"):
- k_lst = k.split("_")
- if len(k_lst) == 2:
- title = f"{(int(k_lst[1]) + 1) * 10}cm土壤温度"
- EnvTempHum.objects.create(
- title = title,
- value = v,
- unit = "℃",
- type = "1",
- date = r,
- format_date = format_date,
- province = province,
- city = city,
- district = district,
- addr_code = addr_code
- )
- elif k.startswith("swc"):
- k_lst = k.split("_")
- if len(k_lst) == 2:
- title = f"{(int(k_lst[1]) + 1) * 10}cm土壤湿度"
- EnvTempHum.objects.create(
- title = title,
- value = v,
- unit = "%",
- type = "2",
- date = r,
- format_date = format_date,
- province = province,
- city = city,
- district = district,
- addr_code = addr_code
- )
- if __name__ == '__main__':
- main(2024, 2025)
|