Ответ Ананда С. Кумара не округляется до ближайшей четверти часа, он обрезает минуты до ближайших 15 минут под ним.
На самом деле, в вашем примере 2015-07-18 13:53:33.280
следует округлить до 2015-07-18 14:00:00.000
, поскольку 53:33.280
ближе к 60 минутам, чем к 45 минутам.
Я нашел более надежный ответ для округления в в этом посте .
Для вашей ситуации это должно работать:
import datetime
def round_time(time, round_to):
"""roundTo is the number of minutes to round to"""
rounded = time + datetime.timedelta(minutes=round_to/2.)
rounded -= datetime.timedelta(minutes=rounded.minute % round_to,
seconds=rounded.second,
microseconds=rounded.microsecond)
return rounded
dt['dtcolumn'] = df['dtcolumn'].apply(lambda x: round_time(x))
Насколько мне известно, нет никакого способа указать порядок на стороне базы данных таким образом, поскольку это было бы слишком специфично для серверной части. Возможно, вы захотите прибегнуть к старой доброй сортировке Python:
class Foo(models.Model):
name = models.CharField(max_length=128)
Foo.objects.create(name='a10')
Foo.objects.create(name='a1')
Foo.objects.create(name='a2')
ordered = sorted(Foo.objects.all(), key=lambda n: (n[0], int(n[1:])))
print ordered # yields a1, a2, 10
Если вы обнаружите, что вам часто нужна такая сортировка, я бы порекомендовал создать собственный подкласс models.Manager
для вашей модели, которая работает заказ. Примерно так:
class FooManager(models.Manager):
def in_a_number_order(self, *args, **kwargs):
qs = self.get_query_set().filter(*args, **kwargs)
return sorted(qs, key=lambda n: (n[0], int(n[1:])))
class Foo(models.Model):
... as before ...
objects = FooManager()
print Foo.objects.in_a_number_order()
print Foo.objects.in_a_number_order(id__in=[5, 4, 3]) # or any filtering expression
@ Ответ Джаррета (выполните сортировку на Python) отлично подходит для простых случаев. Если у вас есть большая таблица и вы хотите, скажем, вывести только первую страницу результатов, отсортированных определенным образом, этот подход не работает (вам нужно вытащить каждую строку из базы данных, прежде чем вы сможете выполнить сортировку). На этом этапе я хотел бы добавить денормализованное поле «сортировка», которое вы заполняете из поля «имя» во время сохранения, которое вы можете отсортировать на уровне БД обычным способом.
Это зависит от того, где вы хотите его использовать.
Если вы хотите использовать его в своих шаблонах, я бы предложил написать тег шаблона, который будет выполнять упорядочивание за вас. В нем вы можете использовать любой алгоритм сортировки, который хотите использовать.
В админке я выполняю настраиваемую сортировку, расширяя шаблоны в соответствии с моими потребностями и загружая тег шаблона, как описано выше