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