1

ファイルを読み込み、 pandas でプロットしますDataFrame。インデックスは DatetimeIndex で、ginput(1)メソッドを使用して 1 つのポイントを取得しますが、取得する座標が間違っています。

コードは次のとおりです。

import pandas as pd
from matplotlib.dates import num2date, date2num
ts = pd.date_range('2012-04-12,16:13:09', '2012-04-14,00:13:09', freq='H')
df = pd.DataFrame(index=ts)
df[0] = 20.6

次に、 ginputを使用してグラフをプロットしてクリックします。

df.plot()
t = pylab.ginput(n=1) #click somewhere near 13-APR-2012

ただし、最初のアイテムはフロートのようです

In [8]: x = t[0][0] # ~ 370631.67741935479

In [9]: num2date(x)
Out[9]: datetime.datetime(1015, 10, 3, 16, 15, 29, 32253, tzinfo=<matplotlib.dates._UTC object at 0x104196550>)
# this is way out!

ドキュメントは、これらのフロートを使用する必要があることを示唆しています(からdatetonum):

In [10]: dt = pd.to_datetime('13-4-2012', dayfirst=True)

In [11]: date2num(dt)
Out[11]: 734606.0

この浮動小数点数とは何ですか? また、日時に変換するにはどうすればよいですか?

注: データフレームから行の 1 つを削除すると、これは正しく機能します。

df1 = df.drop(ts[1], axis=0)
...
4

1 に答える 1

2

For data indexed with a regular frequency, pandas converts the underlying index to a PeriodIndex so that the resolution of the x-tick labels are updated automatically when zooming in and out. So the ordinals you get are Period ordinals.

In order to convert it back into datetime, you can do the following:

In [36]: pd.Period(ordinal=int(t[0][0]), freq='H')
Out[36]: Period('2012-04-12 18:00', 'H')

In [37]: pd.Period(ordinal=int(t[0][0]), freq='H').to_timestamp()
Out[37]: <Timestamp: 2012-04-12 18:00:00>

*Timestamp is a subclass of datetime that keeps nanoseconds

That being said, ideally we would hide the conversion from the user (or not have to do the conversion at all if possible!), as soon as I have enough time to refactor all the plotting code...

于 2012-12-12T14:54:01.233 に答える