Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何返回一年中每天的记录数,而不必在循环中进行代价高昂的查询?_Python_Database_Sqlite_Peewee - Fatal编程技术网

Python 如何返回一年中每天的记录数,而不必在循环中进行代价高昂的查询?

Python 如何返回一年中每天的记录数,而不必在循环中进行代价高昂的查询?,python,database,sqlite,peewee,Python,Database,Sqlite,Peewee,在数据库表中,我们可以找到具有文件路径的记录、处理文件的员工以及处理文件时的时间戳。 表日志中每个员工只包含几千条记录。每个员工每天都有几条记录,但时间戳不是唯一的。 我想提取一个元组列表,其中包含一个日期以及在该日期生成的表条目的数量 我提供的代码可以工作,但速度非常慢。2300条记录的22秒计算时间是荒谬的。 我已经将问题缩小到for循环中的logs\u per\u day=query.select.wherefn.datecls.datetime==checkday.count行。 我知道

在数据库表中,我们可以找到具有文件路径的记录、处理文件的员工以及处理文件时的时间戳。 表日志中每个员工只包含几千条记录。每个员工每天都有几条记录,但时间戳不是唯一的。 我想提取一个元组列表,其中包含一个日期以及在该日期生成的表条目的数量

我提供的代码可以工作,但速度非常慢。2300条记录的22秒计算时间是荒谬的。 我已经将问题缩小到for循环中的logs\u per\u day=query.select.wherefn.datecls.datetime==checkday.count行。 我知道在一个循环中执行许多查询可能不是很好。此外,datetime对象到日期的转换可能也没有帮助。。。 能告诉我一个更好的方法吗

导入日期时间 导入操作系统 从peewee进口* db=SqliteDatabase'logs.db' db=SqliteDatabase':内存:' now=datetime.datetime.now 类BaseModelModel: 类元: 数据库=db 类LogBaseModel: log_ID=AutoField datetime=DateTimeField 字母=CharField 磁盘路径=CharField ftp_path=CharField out=布尔域 employee=CharFieldnull=True 类元: 表_name='log' @类方法 def get_Histori_datacls,员工=某个花花公子,年份=无: 返回包含子列表datetime对象的列表,整数 如果不是年份:如果没有提供年份,查询将返回员工的所有条目 query=cls.select.wherecls.employee==employee.order\u bycls.datetime printemployee、lenquery、条目 firstday=query.order\u bycls.datetime.get.datetime.date lastday=query.order\u bycls.datetime.desc.get.datetime.date else:返回给定年份中的所有条目 查询=cls 选择 .其中cls.employee==员工,cls.datetime.year==年 .order_bycls.datetime 打印{}在{}年中有{}个条目。formatemployee,lenquery,year firstday=datetime.dateyear,1,1 lastday=datetime.dateyear,12,31 打印发送的第一天:,第一天 打印发送的最后一天:,最后一天 daydelta=lastday-firstday.days sendList=[] 对于rangedaydelta+1中的我:修复我:这非常慢!!! checkday=firstday+datetime.timedeltadays=i 每天日志数=查询 选择 .wherefn.datecls.datetime==checkday 计数 printcheckday,***当天日志:,每天日志 sendList.append[检查日,每天日志] 返回发送列表 def初始化: 数据库连接 db.create_tables[Log],safe=True db.close 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 初始化 Log.get_histori_dataemployee=Mr Someone,年份=2018 输出应该类似于[2018-11-121572018-11-131212018-11-140…]

我自己发现的:

def get_histo_data(cls, employee="Some dude", year=None):
    """returns a list of tuples (datetime object, integer)"""
    if not year: # if no year was provided the query return all entries from the employee
        query = cls.select().where(cls.employee == employee).order_by(cls.datetime)
        print(employee, len(query), " entries")

        firstday = query.order_by(cls.datetime).get().datetime.date()
        lastday = query.order_by(cls.datetime.desc()).get().datetime.date()

    else: # returns all entries in the given year
        query = cls.get_query_by_year(employee, year)
        print("{} has {} entries in the year {}".format(employee, len(query), year))

        firstday = datetime.date(year, 1, 1)
        lastday = datetime.date(year, 12, 31)

    ### count the entries
    logDict = dict()
    for record in query:
        date = record.datetime.date()
        if date not in logDict:
            logDict[date] = 1
        else:
            logDict[date] += 1
    ### fill the null days
    daydelta = (lastday-firstday).days
    for i in range(daydelta+1):
        checkday = firstday + datetime.timedelta(days=i)
        if checkday not in logDict:
            logDict[checkday] = 0
        else:
            continue

    return list(sorted(logDict.items()))