web-dev-qa-db-ja.com

pandas散布図の日付時刻

Datetime.timeの2列のデータフレームがあります。それらを散布図にしたいと思います。また、理想的には、軸に時間を表示してほしいです。だが

df.plot(kind='scatter', x='T1', y='T2')

'T1'でKeyErrorで終わる内部プロットエラーの束をダンプします。

あるいは、私は試してみる

plt.plot_date(x=df.loc[:,'T1'], y=df.loc[:,'T2'])
plt.show()

長いスタッククロールで終わる「Tkinterコールバックで例外」が発生します

return _from_ordinalf(x, tz)
  File "/usr/lib/python3/dist-packages/matplotlib/dates.py", line 224, in _from_ordinalf
microsecond, tzinfo=UTC).astimezone(tz)
TypeError: tzinfo argument must be None or of a tzinfo subclass, not type 'str'

ポインタはありますか?

25
jma

実際の答えではなく、Tom Augspurgerが示唆する回避策は、作業ラインプロットタイプを使用して、ラインの代わりにドットを指定できることです。

df.plot(x='x', y='y', style=".")
35

mike Nの答えに基づいて...適切に散布するためにUnix時間に変換してから、軸ラベルをint64から文字列に変換します:

type(df.ts1[0])

pandas.tslib.Timestamp

df['t1'] = df.ts1.astype(np.int64)
df['t2'] = df.ts2.astype(np.int64)

fig, ax = plt.subplots(figsize=(10,6))
df.plot(x='t1', y='t2', kind='scatter', ax=ax)
ax.set_xticklabels([datetime.fromtimestamp(ts / 1e9).strftime('%H:%M:%S') for ts in ax.get_xticks()])
ax.set_yticklabels([datetime.fromtimestamp(ts / 1e9).strftime('%H:%M:%S') for ts in ax.get_yticks()])
plt.show()

enter image description here

4
dvmlls

開始するための基本的な回避策を次に示します。

import matplotlib, datetime
import matplotlib.pyplot as plt

def scatter_date(df, x, y, datetimeformat):
  if not isinstance(y, list):
      y = [y]
  for yi in y:
      plt.plot_date(df[x].apply(
          lambda z: matplotlib.dates.date2num(
              datetime.datetime.strptime(z, datetimeformat))), df[yi], label=yi)
  plt.legend()
  plt.xlabel(x)

# Example Usage
scatter_date(data, x='date', y=['col1', 'col2'], datetimeformat='%Y-%m-%d')
2
J Wang

それはきれいではありませんが、クイックハックとして、Pandasにロードする前に.timestamp()を使用してDateTimeをタイムスタンプに変換できます。 -軸)。

1
Mike N