2016-03-20 103 views
2

Pandasプロットの時系列をプロットしようとしましたが、エラーTypeError: Empty 'DataFrame': no numeric data to plotが表示されています。 matplotlibを使うと直接動作しますが、私はライブラリを誤用していると思いますし、私がPandasを使って間違ったパスを辿ることがないようにしたいと思っています。空のDataFrameエラーでPandasのDateTimeIndexでプロットが発生しました

は、私は2つの列が含まれているデータファイルを持っている:

はここで何が起こっているかです。最初の列はタイムスタンプで、2番目の列は経過時間です。どちらもナノ秒単位です。私が使用してデータに読んでいる:このデータが含まれてい

data = pd.read_table('trace.log', sep=" ", header=None, 
    names=("start", "latency")) 
print(data.head()) 
print(data.dtypes) 

を:

  start latency 
0 27668827345634 754210039 
1 27668827918895 753710503 
2 27668827809194 754495193 
3 27668827974232 754464123 
4 27669581667404 60338395 
start  int64 
latency int64 
dtype: object 

私は、datetime64[ns]startを変換し、この指標を作成し、timedelta64[ns]latencyを変換します。

data.start = pd.to_datetime(data.start, unit="ns") 
data.latency = pd.to_timedelta(data.latency, unit="ns") 
data.set_index('start', inplace=True) 

print(data.head()) 
print(data.dtypes) 
print(data.index) 

は、だから今はDateTimeIndexと時系列を持っていると私の待ち時間は、時間デルタとして表現:私はこれをプロットしようとすると

         latency 
start           
1970-01-01 07:41:08.827345634 00:00:00.754210 
1970-01-01 07:41:08.827495897 00:00:01.395999 
1970-01-01 07:41:08.827574509 00:00:01.395592 
1970-01-01 07:41:08.827605687 00:00:01.381083 
1970-01-01 07:41:08.827634020 00:00:01.381130 
latency timedelta64[ns] 
dtype: object 
DatetimeIndex(['1970-01-01 07:41:08.827345634', 
       '1970-01-01 07:41:08.827495897', 
       ... 
       '1970-01-01 08:11:07.739615123', 
       '1970-01-01 08:11:07.756520620'], 
       dtype='datetime64[ns]', name='start', length=437915, freq=None) 

私が見る問題があります。私はプロットあればということ

/opt/conda/lib/python3.5/site-packages/pandas/tools/plotting.py in _compute_plot_data(self) 
    1092   if is_empty: 
    1093    raise TypeError('Empty {0!r}: no numeric data to ' 
-> 1094        'plot'.format(numeric_data.__class__.__name__)) 
    1095 
    1096   self.data = numeric_data 

TypeError: Empty 'DataFrame': no numeric data to plot 

注:

data.latency.plot() 

を開始時刻対レイテンシーのプロットを生成するために、私は次のエラーを取得する:私は実行することができます見てきた例に基づいて、データを使用してplt.plot(data.index, data.latency)私は私が期待するものを得る。私は決定的な理解が欠けているはずだと思う、あるいはバグが見えている。パンダが統合をプロットするのを使うことができればいいと思う。

答えて

0

あなたはあなたの時間刻みカスタマイズするために、set_major_formatter()を使用することができます。

import io 
import datetime 
import matplotlib 
import matplotlib.pyplot as plt 
import pandas as pd 

data = """\ 
      start latency 
0 27668827345634 754210039 
1 27668827918895 753710503 
2 27668827809194 754495193 
3 27668827974232 754464123 
4 27669581667404 60338395 
""" 
data = pd.read_csv(io.StringIO(data), sep='\s+', index_col=0) 

data.start = pd.to_datetime(data.start, unit="ns") 
# convert nanoseconds to seconds 
data.latency /= 10**9 

# define custom Ticker formatter function 
def timeTicks(x, pos): 
    return str(datetime.timedelta(seconds=x)) 

formatter = matplotlib.ticker.FuncFormatter(timeTicks) 

ax = data.plot(x='start', y='latency') 

# format yticks 
ax.yaxis.set_major_formatter(formatter) 

plt.show() 

enter image description here

+0

私は、あなたが参照しているかのトリックはよく分かりません。明示的にplotコマンドの 'x'データを設定すると動作しますが、 'x'を設定しないで変数をプロットすると、 'x'データのインデックスが使用されることが完全に予想されます。 –

+0

@NoahWatkins、そのトリックは 'set_major_formatter()'を使うことです。私はあなたがプロットのためだけにそれをやっていると思っていたので、 'data.set_index( 'start')'をセーブ(取り除く)するために 'x'を明示的に設定しました。 x軸 - それは速くなければなりません。 – MaxU

関連する問題