1. 程式人生 > 程式設計 >Django中日期時間型欄位進行年月日時分秒分組統計

Django中日期時間型欄位進行年月日時分秒分組統計

1.資料結構說明:

資料結構如下:modification欄位為修改資料時間欄位,格式為 年,月,日,時,分,秒。
案例場景為,根據modification欄位,統計每個統計粒子,產生資料的條數。如需要統計2020年10月29日 每個小時段產生資料的條數。

在這裡插入圖片描述

要進行這種統計需要用到 Django的connection庫。
統計年月日粒子用 date_trunc_sql,統計時分秒用 datetime_extract_sql

2.進行年月日粒子的統計

2.1 官方 date_trunc_sql 原型

def datetime_trunc_sql(self,lookup_type,field_name,tzname):
 """
 Given a lookup_type of 'year','month','day','hour','minute',or
 'second',return the SQL that truncates the given datetime field
 field_name to a datetime object with only the given specificity.
 """
 raise NotImplementedError('subclasses of BaseDatabaseOperations may require a datetime_trunc_sql() method')

解釋說明下:

函式需要傳入三個引數:

  • lookup_type:統計粒子(year->年,月->month,day->日,hour->時,minute->分,second->秒)
  • field_name:統計欄位的名次
  • tzname:時區,在中國一般用的是東8區,傳入8即可

2.2 年

from django.db import connection
from django.db.models import Count
# 'year','second'

select = {'year': connection.ops.datetime_trunc_sql('year','establish',8)}
result = models.FocusOnRecord.objects.extra(select=select).values('year').annotate(number=Count('id')).order_by("year")[0:9]

for key in result:
 print(key)

>>{'year': datetime.datetime(2019,1,0),'number': 2168}
>>{'year': datetime.datetime(2020,'number': 9369}

2.3 月

from django.db import connection
from django.db.models import Count
# 'year','second'

select = {'month': connection.ops.datetime_trunc_sql('month',8)}
result = models.FocusOnRecord.objects.extra(select=select).values('month').annotate(number=Count('id')).order_by("month")[0:9]

for key in result:
 print(key)
 
>>{'month': datetime.datetime(2019,6,'number': 8}
>>{'month': datetime.datetime(2019,7,'number': 51}
>>{'month': datetime.datetime(2019,8,'number': 118}
>>{'month': datetime.datetime(2019,9,'number': 7}
>>{'month': datetime.datetime(2019,10,'number': 731}
>>{'month': datetime.datetime(2019,11,'number': 514}
>>{'month': datetime.datetime(2019,12,'number': 739}
>>{'month': datetime.datetime(2020,'number': 483}
>>{'month': datetime.datetime(2020,2,'number': 921}

2.4 日

from django.db import connection
from django.db.models import Count
# 'year','second'

select = {'day': connection.ops.datetime_trunc_sql('day',8)}
result = models.FocusOnRecord.objects.extra(select=select).values('day').annotate(number=Count('id')).order_by("day")[0:9]

for key in result:
 print(key)
 
>>{'day': datetime.datetime(2019,28,'number': 1}
>>{'day': datetime.datetime(2019,29,'number': 7}
>>{'day': datetime.datetime(2019,'number': 3}
>>{'day': datetime.datetime(2019,20,'number': 32}
>>{'day': datetime.datetime(2019,21,'number': 2}
>>{'day': datetime.datetime(2019,31,'number': 10}
>>{'day': datetime.datetime(2019,'number': 20}

2.5 時

from django.db import connection
from django.db.models import Count
# 'year','second'

select = {'hour': connection.ops.datetime_trunc_sql('hour',8)}
result = models.FocusOnRecord.objects.extra(select=select).values('hour').annotate(number=Count('id')).order_by("hour")[0:9]

for key in result:
 print(key)
 
>>{'hour': datetime.datetime(2019,17,'number': 1}
>>{'hour': datetime.datetime(2019,'number': 6}
>>{'hour': datetime.datetime(2019,14,'number': 2}
>>{'hour': datetime.datetime(2019,15,'number': 24}
>>{'hour': datetime.datetime(2019,'number': 3}
>>{'hour': datetime.datetime(2019,13,'number': 2}

2.6 分

from django.db import connection
from django.db.models import Count
# 'year','second'

select = {'minute': connection.ops.datetime_trunc_sql('minute',8)}
result = models.FocusOnRecord.objects.extra(select=select).values('minute').annotate(number=Count('id')).order_by("minute")[0:9]

for key in result:
 print(key)
 
>>{'minute': datetime.datetime(2019,22),'number': 1}
>>{'minute': datetime.datetime(2019,6),'number': 4}
>>{'minute': datetime.datetime(2019,39),41),4),57),48),54),40),'number': 1}

2.7 秒

from django.db import connection
from django.db.models import Count
# 'year','second'

select = {'second': connection.ops.datetime_trunc_sql('second',8)}
result = models.FocusOnRecord.objects.extra(select=select).values('second').annotate(number=Count('id')).order_by("second")[0:9]

for key in result:
 print(key)

>>{'second': datetime.datetime(2019,22,'number': 1}
>>{'second': datetime.datetime(2019,1),18),35),36),39,30),41,17),4,15),57,56),'number': 1}

到此這篇關於Django中日期時間型欄位進行年月日時分秒分組統計的文章就介紹到這了,更多相關Django 日期時間型欄位統計內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!