我在Python中有一些数据,这些数据最终被绘制在图形上(Highcharts),问题是x轴(时间)上数据点之间的间隔不规则.虽然准确,但从视觉上看,图形似乎有些不稳定.
数据格式如下:
data = {"points": [[1335360000, 1335361920, 93374739787], [1335361920, 1335447840, 11738851087.0]......]}
即:时间戳从,时间戳到,值
我需要做的是修改数据,以便将其归一化为最低频率/最长时间间隔,以便在绘制在图表上时看起来一致.
关于最有效的方法有什么想法吗?
更新资料
在这种情况下,我真的不能使用任何第三方的库.
图形通常是这样绘制的,在数据点靠在一起的地方显得更加锯齿:
解决方法:
如果您还没有尝试过,您可能会发现pandas库对于将不规则的时间序列转换为常规的时间序列非常有用(一般来说,还有其他类型的data-manipulation-jui-jitsu).使用(一旦学习它们,干净,可重用的习惯用语)进行编程是高效的,并且在运行时(经过cython优化)快速.
为了让您有品味,这里有一些基于您描述的数据格式的熊猫示例.
>将数据读入pandas.DataFrame. (DataFrame的作用就像列的字典,其中的值是numpy数组.)
In [33]: df = pandas.DataFrame(data['points'], columns=['from', 'to', 'value'])
In [34]: df
Out[34]:
from to value
0 1335360000 1335360004 3
1 1335360004 1335360008 32
2 1335360008 1335360009 4
3 1335360009 1335360011 36
4 1335360011 1335360014 38
>转换现有列并添加派生列
In [46]: utcfromtimestamp = datetime.datetime.utcfromtimestamp
In [47]: df['from'] = df['from'].map(utcfromtimestamp)
In [48]: df['to'] = df['to'].map(utcfromtimestamp)
In [49]: df['delta'] = [x.total_seconds() for x in (df['to'] - df['from'])]
In [50]: df['avg/s'] = df['value'] / df['delta']
In [51]: df
Out[51]:
from to value delta avg/s
0 2012-04-25 13:20:00 2012-04-25 13:20:04 3 4 0.750000
1 2012-04-25 13:20:04 2012-04-25 13:20:08 32 4 8.000000
2 2012-04-25 13:20:08 2012-04-25 13:20:09 4 1 4.000000
3 2012-04-25 13:20:09 2012-04-25 13:20:11 36 2 18.000000
4 2012-04-25 13:20:11 2012-04-25 13:20:14 38 3 12.666667
>分组并选择要绘制的信息
In [78]: df.groupby('from')['avg/s'].mean()
Out[78]:
from
2012-04-25 13:20:00 0.750000
2012-04-25 13:20:04 8.000000
2012-04-25 13:20:08 4.000000
2012-04-25 13:20:09 18.000000
2012-04-25 13:20:11 12.666667
Name: avg/s
有关上采样或下采样时间序列的信息,请参见this link.仍在开发中的下一个版本(0.8)提供了更干净的方法来重新采样时间序列.
标签:graph,python