如何用Python按比例分配日期到尺度上

0 投票
3 回答
1176 浏览
提问于 2025-04-15 12:19

我有一个非常简单的图表组件,它的x轴和y轴都是整数。不过我现在遇到一个问题,我需要在这个图表上表示日期和小数。所以我想可以把日期按比例分配到一个刻度上。举个例子,假设我有以下日期:2008年1月1日、2008年2月1日和2008年12月31日。我的算法应该返回0、16.667和100(1个月等于16.667%)。

我尝试使用Python 2.5中的datetimetimedelta类,但没能实现这个功能。我本以为可以利用刻度的数量,但我甚至无法从datetime中获取到这个信息。

有没有什么办法可以在Python中写出这个算法?或者有没有其他的想法或算法呢?

3 个回答

0

我不太确定你想要做什么,但你可以把时间当作自UNIX时代以来的秒数来处理,然后用简单的减法来计算一个范围,这样你就可以把它调整到你图表的大小。

在Processing中,map函数会帮你处理这种情况。你可以查看这个链接了解更多:http://processing.org/reference/map_.html。我相信你可以根据自己的需要进行调整。

1

把时间差(timedelta)转换成数字值其实很简单。

首先,选择一个基准时间(epoch time)。然后,计算每个时间值与这个基准时间的差值。接着,把这些差值转换成数字。最后,就像平常一样把这些数字进行映射。

转换的过程很直接,像这样:

def f(delta):
   return delta.seconds + delta.days * 1440 * 60 + 
      (delta.microseconds / 1000000.0)
3

如果你在处理日期的话,可以使用一个叫做 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% 大约是一年中的两个月,所以2月1日的比例大约是这个的一半。

撰写回答