6

pandas で作成された時系列プロットから、プロットの xlimits を python datetime オブジェクトとして取得しようとしています。を使用ax.get_xlim()すると、軸の範囲が として返されますnumpy.float64が、数値を使用可能な日時に変換する方法がわかりません。

import pandas 
from matplotlib import dates
import matplotlib.pyplot as plt
from datetime import datetime
from numpy.random import randn

ts = pandas.Series(randn(10000), index=pandas.date_range('1/1/2000',
    periods=10000, freq='H')) 
ts.plot()
ax = plt.gca()

ax.set_xlim(datetime(2000,1,1))
d1, d2 = ax.get_xlim()
print "%s(%s) to %s(%s)" % (d1, type(d1), d2, type(d2))

print "Using matplotlib: %s" % dates.num2date(d1)
print "Using datetime: %s" % datetime.fromtimestamp(d1)

戻り値:

262968.0 (<type 'numpy.float64'>) to 272967.0 (<type 'numpy.float64'>)
Using matplotlib: 0720-12-25 00:00:00+00:00
Using datetime: 1970-01-03 19:02:48

pandas timeseries docsによると、pandas は numpy.datetime64 dtype を使用します。パンダのバージョン「0.9.0」を使用しています。

ユーザーがプロット領域内を移動したときにコールバックを使用して他のことを行うためget_xlim()、代わりに pandas シリーズに直接アクセスしてい ます。xlim_changed

ハックして使用可能な値を取得する

上記の例では、制限はエポックからの時間数で返されます。したがって、エポック以降の秒数に変換して、time.gmtime()使用可能な場所を取得するために使用できますが、これはまだ正しくありません。

In [66]: d1, d2 = ax.get_xlim()

In [67]: time.gmtime(d1*60*60)
Out[67]: time.struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=0)  
4

2 に答える 2

6

matplotlib.datesの現在の動作:

datetime オブジェクトは、UTC 0001-01-01 + 1 からの時間を表す浮動小数点数に変換されます。たとえば、0001-01-01, 06:00 は 0.25 ではなく 1.25 です。ヘルパー関数 date2num()、num2date()、および drange() を使用すると、datetime および数値の範囲との間で簡単に変換できます。

pandas.tseries.converter.PandasAutoDateFormatter() はこれに基づいているようです。

x = pandas.date_range(start='01/01/2000', end='01/02/2000')
plt.plot(x, x)
matplotlib.dates.num2date(plt.gca().get_xlim()[0])

与えます:

datetime.datetime(2000, 1, 1, 0, 0, tzinfo=<matplotlib.dates._UTC object at 0x7ff73a60f290>)
于 2015-04-13T20:20:51.573 に答える
5
# First convert to pandas Period
period = pandas.tseries.period.Period(ordinal=int(d1), freq=ax.freq)
# Then convert to pandas timestamp
ts = period.to_timestamp()
# Then convert to date object
dt = ts.to_datetime()
于 2012-11-16T20:28:22.530 に答える