2016-09-01 70 views
3

由於matplotlib不支持eitherpandas.TimeStampornumpy.datetime64,並有no simple workarounds,我決定到本地大熊貓日期列轉換爲純Python datetime.datetime,使散點圖容易使。存儲在數據幀的熊貓純Python datetime.datetime

但是:

t = pd.DataFrame({'date': [pd.to_datetime('2012-12-31')]}) 
t.dtypes # date datetime64[ns], as expected 
pure_python_datetime_array = t.date.dt.to_pydatetime() # works fine 
t['date'] = pure_python_datetime_array # doesn't do what I hoped 
t.dtypes # date datetime64[ns] as before, no luck changing it 

我猜大熊貓自動轉換由to_pydatetime製作成其原生格式的純Python datetime。我想這是一般的便捷行爲,但是有沒有辦法覆蓋它?

+0

我無法理解你真正想要的格式。你只想要約會嗎?還是時間?見例如http://codrspace.com/szeitlin/biking-data-from-xml-to-plots-part-2/ – szeitlin

+0

我希望列'date'具有實際的'datetime.datetime'對象。由'to_pydatetime()'函數返回的那些。我不想在該列中使用'TimeStamp',因爲matplotlib無法使用它繪製散點圖。 – max

回答

2

使用to_pydatetime()是正確的。

In [87]: t = pd.DataFrame({'date': [pd.to_datetime('2012-12-31'), pd.to_datetime('2013-12-31')]}) 

In [88]: t.date.dt.to_pydatetime() 
Out[88]: 
array([datetime.datetime(2012, 12, 31, 0, 0), 
     datetime.datetime(2013, 12, 31, 0, 0)], dtype=object) 

當你將它回t.date,它會自動將其轉換回datetime64

pandas.Timestamp是一個日期的子類反正:)

一種方式做該地塊於日期轉換爲Int64的:

In [117]: t = pd.DataFrame({'date': [pd.to_datetime('2012-12-31'), pd.to_datetime('2013-12-31')], 'sample_data': [1, 2]}) 

In [118]: t['date_int'] = t.date.astype(np.int64) 

In [119]: t 
Out[119]: 
     date sample_data    date_int 
0 2012-12-31   1 1356912000000000000 
1 2013-12-31   2 1388448000000000000 

In [120]: t.plot(kind='scatter', x='date_int', y='sample_data') 
Out[120]: <matplotlib.axes._subplots.AxesSubplot at 0x7f3c852662d0> 

In [121]: plt.show() 

enter image description here

另一個解決方法是(不使用分散,但是...):

In [126]: t.plot(x='date', y='sample_data', style='.') 
Out[126]: <matplotlib.axes._subplots.AxesSubplot at 0x7f3c850f5750> 

而且,最後的解決辦法:

In [141]: import matplotlib.pyplot as plt 

In [142]: t = pd.DataFrame({'date': [pd.to_datetime('2012-12-31'), pd.to_datetime('2013-12-31')], 'sample_data': [100, 20000]}) 

In [143]: t 
Out[143]: 
     date sample_data 
0 2012-12-31   100 
1 2013-12-31  20000 
In [144]: plt.scatter(t.date.dt.to_pydatetime() , t.sample_data) 
Out[144]: <matplotlib.collections.PathCollection at 0x7f3c84a10510> 

In [145]: plt.show() 

enter image description here

這有一個問題在github,這是目前開放的。

+0

是的,我認爲問題在於't.date'不是引用名爲'date'的列的推薦方式。 't''date']'更清晰。 – szeitlin

+0

我需要該列包含純python datetime.datetime對象。這樣,對'df.plot(kind ='scatter',...)的調用不會失敗。 – max

+0

@max而不是'df。plot',你可以直接調用'matplotlib.pyplot.scatter'。我已經更新了答案。 –

0

對於我來說,這些步驟是這樣的:用熊貓

  1. 轉換時區與pytz
  2. 轉換to_datetime,使該指數
  3. 情節和自動套用格式

開始DF外觀像這樣:

before converting timestamps

  1. import pytz ts['posTime']=[x.astimezone( pytz.timezone('US/Pacific')) for x in ts['posTime']]

我可以看到,它的工作,因爲時間戳改變格式:

after timezone conversion

  • sample['posTime'] = pandas.to_datetime(sample['posTime'])

    sample.index = sample['posTime']

  • 此時,只需用大熊貓繪圖(使用matplotlib罩下)給我一個很好的旋轉和完全錯誤的格式:

    after pandas datetime conversion

  • 但是,對象的格式沒有問題。我現在可以用matplotlib創建散點圖,並按照您的預期自動生成日期時間。

    plt.scatter(sample['posTime'].values, sample['Altitude'].values)

    fig = plt.gcf()

    fig.set_size_inches(9.5, 3.5)

  • formatted

  • 如果使用自動格式化方法,可以放大和它將繼續自動選擇適當的格式(但你仍然必須選擇噸手動)。
  • autoformatted