如何根据django查询中的日期获得等距离的行?

时间:2017-08-31 19:57:40

标签: python django date

我正在编写一个django应用程序,我从数据库中收集数据。我的模型包含一个名为date的日期字段。

我想将日期放入折线图中。因为表格中可能有数百个日期。我想通过从整个表格中选择10个相等距离的日期来缩小数据。

例如,如果我的行包含日期1/09/2013 - 20/09/2013,我想得到:

1/09/2013
3/09/2013
5/09/2013
7/09/2013
9/09/2013
11/09/2013
13/09/2013
15/09/2013
17/09/2013
19/09/2013

这是我的模特:

class Model(models.Model):
    date = models.DateField()

这是我的问题:

data = Model.objects.all()

我想以最安全的方式做到这一点,因为我的数据库中的日期可能是不规则的。 如何根据data.date这样划分数据?是否有django的预建功能?任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

尝试:只需获取第一个和最后一个日期之间的差异,除以10即可获得2个记录之间的差异。然后循环获取10条记录。

data = Model.objects.all().order_by('date')

n = data.length()
date_first = data[0].date
date_last = data[n].date

days_diff = (date_last-date_first).days

diff= days_diff/10;

# Now store date in a list

date=[]
for i in range(0,10)
     date.insert(i,date_first + i* datetime.timedelta(days=diff) )

答案 1 :(得分:0)

我知道这个问题有一个答案,但是最可靠,无错误的方法是仅依靠内置的pandas功能。

>>> import pandas as pd
>>> start = pd.Timestamp('2013-9-1')
>>> end = pd.Timestamp('2013-9-20')
>>> periods = 10
>>> freq = (end - start + pd.Timedelta(days=1)) // periods
>>> dates = pd.date_range(start, periods=periods, freq=freq)
>>> dates
DatetimeIndex(['2013-09-01', '2013-09-03', '2013-09-05', '2013-09-07',
               '2013-09-09', '2013-09-11', '2013-09-13', '2013-09-15',
               '2013-09-17', '2013-09-19'],
              dtype='datetime64[ns]', freq='2D')
>>> dates.to_pydatetime().tolist()
[datetime.datetime(2013, 9, 1, 0, 0),
 datetime.datetime(2013, 9, 3, 0, 0),
 datetime.datetime(2013, 9, 5, 0, 0),
 datetime.datetime(2013, 9, 7, 0, 0),
 datetime.datetime(2013, 9, 9, 0, 0),
 datetime.datetime(2013, 9, 11, 0, 0),
 datetime.datetime(2013, 9, 13, 0, 0),
 datetime.datetime(2013, 9, 15, 0, 0),
 datetime.datetime(2013, 9, 17, 0, 0),
 datetime.datetime(2013, 9, 19, 0, 0)]