2016-04-29 3 views
1

これはすべてiPythonカーネルで行われていると言いますが、私が取った措置は以下のコードです。Matplotlib(Seaborn)datetimeとtimedeltaで予期せぬ動作をするset_xticks

I持って、次のコードによって生成される次の表:

from queries import TOTAL, DEMO, DB_CREDENTIALS, TOTAL_USA_EX, TOTAL_ESPN_EX 
import pandas as pd 
import pyodbc 
pd.options.mode.chained_assignment = None # default='warn'  
import seaborn as sns 
from matplotlib import pyplot as plt 
from datetime import datetime, timedelta 
mpl.rc('font',family='Arial Rounded MT Bold') 
y_label = {'fontsize':14} 
title = {'fontsize':30} 
s_legend = {'fontsize':14, 'handlelength':7} 

with pyodbc.connect(DB_CREDENTIALS) as cnxn: 
    df = pd.read_sql(sql=TOTAL_USA_EX, con=cnxn) 
    df['date'] = pd.to_datetime(df['date']) 
    df_e = pd.read_sql(sql=TOTAL_ESPN_EX, con=cnxn) 
    df_e['date'] = pd.to_datetime(df_e['date']) 

ex_ = df 
ex_['subject'] = ex_['date'] - ex_['date'].min() 
ex_['subject'] = ex_['subject'].apply(lambda x: x.days) 
ex_['hour'] = ex_['datetime'].apply(lambda x: x.hour) 
ex_['minute'] = ex_['datetime'].apply(lambda x: x.minute) 
ex_['minute'] = ex_['minute'] // 15 
ex_['qh'] = ex_.apply(lambda x: x['minute'] + (x['hour']*4), axis=1) 
ex_['imp'] = ex_['imp'].apply(lambda x: round(x/1000000.0,3)) 
ex_['station'] = 'USA' 

ex_e = df_e 
ex_e['subject'] = ex_e['date'] - ex_e['date'].min() 
ex_e['subject'] = ex_e['subject'].apply(lambda x: x.days) 
ex_e['hour'] = ex_e['datetime'].apply(lambda x: x.hour) 
ex_e['minute'] = ex_e['datetime'].apply(lambda x: x.minute) 
ex_e['minute'] = ex_e['minute'] // 15 
ex_e['qh'] = ex_e.apply(lambda x: x['minute'] + (x['hour']*4), axis=1) 
ex_e['imp'] = ex_e['imp'].apply(lambda x: round(x/1000000.0,3)) 
ex_e['station'] = 'ESPN' 

data = pd.concat([ex_, ex_e])   

fig, ax = plt.subplots() 
fig.set_size_inches(14, 7) 
sns.tsplot(time='qh', value='imp', unit='subject', condition='station', 
      ci=80, data=data, ax=ax, linewidth=2, color=["#21A0A0", "#E53D00"]) 
ax.set_ylabel('IMPRESSIONS (M)', **y_label) 
ax.set_xlabel('TIME', **y_label) 
ax.set_title('STATION IMPRESSIONS: 80% CONFIDENCE INTERVAL') 
ax.set_xticks([x for x in xrange(0,96,8)]) 
ax.set_xticklabels([(datetime(year=2015,month=12,day=28)+timedelta(minutes=15*(x))).strftime('%H:%M') for x in ax.get_xticks()]); 

x_ticksを15分間隔で設定されているので、予想される動作は、各2時間の増分で目盛を設定することであろう(例えば、xticklabel[0] = 00:00、xticklabel[1] = 02:00など)。

しかし、何らかの理由で、次が生成されます。

Showing only time.

は、私は以下の正確混乱まだ、何が起こっているかを見るために、日付と月を追加します。

Wrong graph, showing the dates are acting wonky.

だから私は直感的に、私はaxが作成された後ティックオブジェクトにアクセスしようとすると何が起こるかを見て、計算が行われつつある、そしてそれは、いくつかのスーパー紛らわしい行動を明らかにしている場合見て、エラーを再作成しようとしました:

In [19]: 
i = ax.get_xticks() 
[(timedelta(minutes=15*(j)), j) for j in i ] 

Out [19]: 
[(datetime.timedelta(0), 0), 
(datetime.timedelta(-1, 85010, 65408), 8), 
(datetime.timedelta(0, 1515, 98112), 16), 
(datetime.timedelta(0, 125, 163520), 24), 
(datetime.timedelta(-1, 85135, 228928), 32), 
(datetime.timedelta(0, 1640, 261632), 40), 
(datetime.timedelta(0, 250, 327040), 48), 
(datetime.timedelta(-1, 85260, 392448), 56), 
(datetime.timedelta(0, 1765, 425152), 64), 
(datetime.timedelta(0, 375, 490560), 72), 
(datetime.timedelta(-1, 85385, 555968), 80), 
(datetime.timedelta(0, 1890, 588672), 88)] 

iとは何ですか?

In [20]: 
i 
Out [20]: 
array([ 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88]) 

だから私はjupyterで別のカーネルを開いて、私は真空中で同じエラーを複製することができるかどうかを確認。そして、私はできないよ:

新しいカーネル

In [1]: 
from datetime import datetime, timedelta 
i = [x*15 for x in xrange(0,96,8)] 
[timedelta(minutes=x) for x in i] 

Out [1]: 
[datetime.timedelta(0), 
datetime.timedelta(0, 7200), 
datetime.timedelta(0, 14400), 
datetime.timedelta(0, 21600), 
datetime.timedelta(0, 28800), 
datetime.timedelta(0, 36000), 
datetime.timedelta(0, 43200), 
datetime.timedelta(0, 50400), 
datetime.timedelta(0, 57600), 
datetime.timedelta(0, 64800), 
datetime.timedelta(0, 72000), 
datetime.timedelta(0, 79200)] 

は、誰もがここに狂っから私を助けることができますか?

二つの迅速な編集:

1)日時2015年12月28日は完全に任意である、私はちょうど私の軸のためにそれに関連する時間を必要とする日付を必要としません。どんなデートもするでしょうが、私が期待している振る舞いを考えれば、ここでは問題ではありません。

2)ちょうどそれは、これが正常に動作し、同様の新しいカーネルでは、奇妙な構文エラーのいくつかの並べ替えではなかったことを確認する:#learnprogrammingチャネルにdarkfする

In [2]: 
from datetime import datetime, timedelta 
i = [x for x in xrange(0,96,8)] 
[timedelta(minutes=(x)*15) for x in i] 
Out [2]: 
[datetime.timedelta(0), 
datetime.timedelta(0, 7200), 
datetime.timedelta(0, 14400), 
datetime.timedelta(0, 21600), 
datetime.timedelta(0, 28800), 
datetime.timedelta(0, 36000), 
datetime.timedelta(0, 43200), 
datetime.timedelta(0, 50400), 
datetime.timedelta(0, 57600), 
datetime.timedelta(0, 64800), 
datetime.timedelta(0, 72000), 
datetime.timedelta(0, 79200)] 

答えて

0

感謝を。これは、ax.get_xticks()メソッドから返されたアイテムのタイプがnumpy.int32であるために発生します。実際のintではなくポインタ参照を返す可能性があります。

修正されたコードの行:

x.set_xticklabels([(datetime(year=2015,month=12,day=28)+timedelta(minutes=15*(int(x)))).strftime('%H:%M') for x in ax.get_xticks()]); 

をグラフ:

enter image description here

ありがとう!

関連する問題