如何用Python按比例分配日期到尺度上
我有一个非常简单的图表组件,它的x轴和y轴都是整数。不过我现在遇到一个问题,我需要在这个图表上表示日期和小数。所以我想可以把日期按比例分配到一个刻度上。举个例子,假设我有以下日期:2008年1月1日、2008年2月1日和2008年12月31日。我的算法应该返回0、16.667和100(1个月等于16.667%)。
我尝试使用Python 2.5中的datetime
和timedelta
类,但没能实现这个功能。我本以为可以利用刻度的数量,但我甚至无法从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日的比例大约是这个的一半。