大熊猫可以绘制时间序列而不试图将索引转换为期间吗?

use*_*410 6 python time-series matplotlib pandas

在绘制时间序列时,我观察到一种不寻常的行为,最终导致无法格式化绘图的xticks.似乎pandas在内部尝试将索引转换为PeriodIndex,但显然只有在时间戳值相等的情况下才能成功.如果它们间隔不均匀(或者 - 奇怪的是 - 如果它们间隔均匀但有时区感知),索引仍然是DatetimeIndex.后一种情况按预期工作.我可以设置DateFormatter和Locators.但是,如果索引在绘图之前被逐步转换为PeriodIndex,则生成的plott的x轴似乎搞砸了.

这是一个重现问题的示例.

from pandas import Series, DataFrame
import pandas as pd
from datetime import datetime
import pytz
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

idx1 = np.array([datetime(2014, 1, 16, 0),
                 datetime(2014, 1, 16, 5),
                 datetime(2014, 1, 16, 10),
                 datetime(2014, 1, 16, 15), 
                 datetime(2014, 1, 16, 20), 
                 datetime(2014, 1, 17, 1)])
idx2 = np.array([datetime(2014, 1, 16, 0),
                 datetime(2014, 1, 16, 5),
                 datetime(2014, 1, 16, 10),
                 datetime(2014, 1, 16, 15),
                 datetime(2014, 1, 16, 20),
                 datetime(2014, 1, 16, 23)])
y = [0, 2, np.nan, 5, 2, 1]
tz = pytz.timezone('Europe/Berlin')

fig, (ax1, ax2, ax3) = plt.subplots(1,3, figsize=(15,4))

# index convertible to period index
s1 = Series(y, index=idx1)
s1.plot(ax=ax1)
print ax1.get_xticks()
print ax1.xaxis.get_major_locator()
print ax1.xaxis.get_major_formatter()
#ax1.xaxis.set_major_formatter(mpl.dates.DateFormatter('%H'))
#ax1.xaxis.set_major_locator(mpl.ticker.MultipleLocator(0.25))

# index not convertible to period index
s2 = Series(y, index=idx2)
s2.plot(ax=ax2)
print ax2.get_xticks()
#ax2.xaxis.set_major_formatter(mpl.dates.DateFormatter('%H'))
#ax2.xaxis.set_major_locator(mpl.ticker.MultipleLocator(0.25))

# index convertible to period index but tz-aware
s3 = Series(y, index=idx1)
s3 = s3.tz_localize(tz)
s3.plot(ax=ax3)
print ax3.get_xticks()
#ax2.xaxis.set_major_formatter(mpl.dates.DateFormatter('%H'))
#ax2.xaxis.set_major_locator(mpl.ticker.MultipleLocator(0.25))

fig.autofmt_xdate()  # just temporarily

plt.tight_layout()
plt.show(block=False)
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉大熊猫保持索引的原始格式,而不是将其转换为期间?任何想法如何处理这一点非常感谢!

我使用pandas 0.13和matplotlib 1.3.1

作为旁注:
如果时区未全部转换为UTC,那当然会很棒.但是我意识到这个问题可能还会持续一段时间.但是,如果有人有一个解决方法的提示,我会很高兴听到(我尝试将tz直接传递给DateFormatter.这很有效,但Locators似乎并不喜欢它).

jor*_*ris 5

解决这个问题的一种方法是不使用pandas plot方法,而是直接使用matplotlib的plot函数.s1.plot(ax=ax1)然后会成为:

ax1.plot(s1.index, s1)
Run Code Online (Sandbox Code Playgroud)

如果您随后打印,则ax1.get_xticks()与不规则时间序列相同,因为日期时间值未转换为期间.这样做的一个缺点是你松开了熊猫的更智能的日期轴格式(但是你想要适应它,不是我想的问题).

据我所知,你不能在熊猫公共api中指定这个(除了故意制造你的时间序列不规则或添加时区之外的丑陋黑客)