使用日期时间自定义比例

时间:2016-05-19 10:48:07

标签: python pandas matplotlib

我正在尝试实现自定义比例(源自matplotlib.scale.ScaleBase)和自定义转换(源自matplotlib.transforms.Transform)以进行特殊的时间序列绘制,因此它仅用于x轴并且对于某种形式的日期时间数据,即numpy日期时间数组或pandas DateIndex

转换需要知道x值表示的实际时间,但不幸的是浮点数被传递到Transform.transform_non_affine方法,并且它不知道时间单位是什么(秒?分钟?小时?天?)。

from matplotlib import scale as mscale
from matplotlib import transforms as mtransforms
import numpy as np
import pandas as pd
import datetime

class MyScale(mscale.ScaleBase):
    name = 'myscale'

    def __init__(self, axis, **kwargs):
        super(MyScale, self).__init__()

    def get_transform(self):
        return MyTransform()

    def set_default_locators_and_formatters(self, axis):
        return


class MyTransform(mtransforms.Transform):
    input_dims = 1
    output_dims = 1
    is_separable = True
    has_inverse = True

    def __init__(self):
        super(MyTransform, self).__init__()

    def transform_non_affine(self, a):
        # ideally some time-dependent transforms here instead...
        print a, a.dtype
        return np.asanyarray(a)

    def inverted(self):
        raise NotImplementedError('not implemented')

然后,如果我这样做:

t = pd.date_range('20160420 07:42', '20160421 12:12', freq='30T')
ts = pd.Series(np.arange(t.size), index=t)
import matplotlib.pyplot as plt
plt.gca().set_xscale('myscale')
ts.plot()

我看到以下打印件:

[ 24352302.  24354012.] float64
[ 24352302.] float64
[ 24353280.] float64
[ 24354012.] float64
[ 24352380.] float64
[ 24352560.] float64
[ 24352740.] float64
[ 24352920.] float64
[ 24353100.] float64
[ 24353280.] float64
[ 24353460.] float64
[ 24353640.] float64
[ 24353820.] float64
[ 24354000.] float64
[ 24352302.  24352302.] float64
[ 24352302.  24352302.] float64
[ 24352302.] float64
[ 24352302.] float64
[ 24352302.] float64
[ 24352302.] float64
[ 24353280.  24353280.] float64
[ 24353280.  24353280.] float64
[ 24353280.] float64
[ 24353280.] float64
[ 24353280.] float64
[ 24353280.] float64
[ 24353280.] float64
[ 24354012.  24354012.] float64
[ 24354012.  24354012.] float64
... 
[ 13.  13.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0.  1.] float64
[ 0.  1.] float64
...
[ 24352302.  24352332.  24352362.  24352392.  24352422.  24352452.
  24352482.  24352512.  24352542.  24352572.  24352602.  24352632.
  24352662.  24352692.  24352722.  24352752.  24352782.  24352812.
  24352842.  24352872.  24352902.  24352932.  24352962.  24352992.
  24353022.  24353052.  24353082.  24353112.  24353142.  24353172.
  24353202.  24353232.  24353262.  24353292.  24353322.  24353352.
  24353382.  24353412.  24353442.  24353472.  24353502.  24353532.
  24353562.  24353592.  24353622.  24353652.  24353682.  24353712.
  24353742.  24353772.  24353802.  24353832.  24353862.  24353892.
  24353922.  24353952.  24353982.  24354012.] float64
...

那个long数组是实际的日期时间数组,看起来像是以分钟为单位转换为float:

.>>> np.datetime64(24352302, 'm')
numpy.datetime64('2016-04-20T02:42-0500')

任何想法如何解决这个问题?

0 个答案:

没有答案