Как распределить пропорционально даты в масштабе с Python - PullRequest
0 голосов
/ 18 июня 2009

У меня есть очень простой компонент построения диаграмм, который принимает целое число на оси х / у. Моя проблема в том, что мне нужно представить дату / число с плавающей точкой на этом графике. Поэтому я решил распределить даты пропорционально по шкале. Другими словами, допустим, у меня есть следующая дата: 01.01.2008, 02.01.2008 и 31.12.2008. Алгоритм вернет 0, 16,667 и 100 (1 месяц = ​​16,667%).

Я пытался играть с datetime и timedelta классами Python 2.5, и я не могу этого достичь Я думал, что смогу использовать количество тиков, но я даже не могу получить эту информацию из datetime.

Есть идеи, как мне написать этот алгоритм на Python? Иначе какие-нибудь другие идеи или алгоритмы?

Ответы [ 3 ]

3 голосов
/ 18 июня 2009

Если вы имеете дело с датами, то вы можете использовать метод toordinal .

import datetime

jan1=datetime.datetime(2008,1,1)
dec31=datetime.datetime(2008,12,31)
feb1=datetime.datetime(2008,02,01)

dates=[jan1,dec31,feb1]
dates.sort()

datesord=[d.toordinal() for d in dates]
start,end=datesord[0],datesord[-1]

def datetofloat(date,start,end):
    """date,start,end are ordinal dates
    ie Jan 1 of the year 1 has ordinal 1
       Jan 1 of the year 2008 has ordinal 733042"""
    return (date-start)*1.0/(end-start)

print datetofloat(dates[0],start,end)
  0.0
print datetofloat(dates[1],start,end)
  0.0849315068493*
print datetofloat(dates[2],start,end)
  1.0

* 16,67% - это примерно два месяца в году, поэтому доля на 1 февраля составляет примерно половину от этого.

1 голос
/ 18 июня 2009

Довольно просто преобразовать временную дельту в числовое значение.

Выберите время эпохи. Рассчитайте дельты для каждого значения относительно эпохи. Преобразуйте дельты в числовые значения. Затем сопоставьте числовые значения, как обычно.

Конвертация прямо вперед. Что-то вроде:

def f(delta):
   return delta.seconds + delta.days * 1440 * 60 + 
      (delta.microseconds / 1000000.0)
0 голосов
/ 18 июня 2009

Я не знаю, полностью ли я понимаю, что вы пытаетесь сделать, но вы можете просто иметь дело с временным интервалом в секундах с эпохи UNIX, а затем просто использовать простое старое вычитание, чтобы получить диапазон, который вы можете масштабировать до размер вашего участка.

При обработке функция map будет обрабатывать этот случай для вас. http://processing.org/reference/map_.html Я уверен, что вы можете адаптировать это для ваших целей

...