2014-02-26 142 views
0

我已經使用openpyxl將數據從Excel電子表格讀取到名爲'tides'的pandas數據框中。該數據集包含超過32,000行數據(英國每15分鐘測量一次潮汐時間)。其中一列包含日期和時間信息(變量稱爲'datetime'),另一列包含潮汐的高度(稱爲「潮汐」):matplotlib在圖上繪製奇怪的水平線

我想繪製沿x軸的日期時間和y軸使用:

import numpy  as np 
import matplotlib  as mpl 
import matplotlib.pyplot as plt 
import pandas  as pd 
import openpyxl 
import datetime  as dt 
from matplotlib.dates import date2num 

<-- Data imported from Excel spreadsheet into DataFrame using openpyxl. --> 
<-- Code omitted for ease of reading.         --> 

# Convert datatime variable to datetime64 format: 
tides['datetime'] = pd.to_datetime(tides['datetime']) 

# Plot figure of 'datetime' vs 'tide': 
fig = plt.figure() 
ax_tides = fig.add_subplot(1,1,1) 
ax_tides.plot_date(date2num(phj_tides['datetime']),phj_tides['tide'],'-',xdate=True,label='Tides 2011',linewidth=0.5) 

min_datetime = dt.datetime.strptime('01/01/2011 00:00:00',"%d/%m/%Y %H:%M:%S") 
max_datetime = dt.datetime.strptime('03/01/2011 23:59:45',"%d/%m/%Y %H:%M:%S") 
ax_tides.set_xlim([min_datetime, max_datetime]) 

plt.show() 

enter image description here

該圖顯示僅僅是數據的最初幾天。然而,從一天到下一天的變化,會發生一些奇怪的事情;在第1天的最後一點後,該線消失到右側,然後返回以繪製第二天的第一個點 - 但數據在y軸上的繪製不正確。這發生在整個數據集中。打印輸出顯示數據似乎沒問題。

number   datetime tide 
0  1 2011-01-01 00:00:00 4.296 
1  2 2011-01-01 00:15:00 4.024 
2  3 2011-01-01 00:30:00 3.768 
3  4 2011-01-01 00:45:00 3.521 
4  5 2011-01-01 01:00:00 3.292 
5  6 2011-01-01 01:15:00 3.081 
6  7 2011-01-01 01:30:00 2.887 
7  8 2011-01-01 01:45:00 2.718 
8  9 2011-01-01 02:00:00 2.577 
9  10 2011-01-01 02:15:00 2.470 
10  11 2011-01-01 02:30:00 2.403 
11  12 2011-01-01 02:45:00 2.389 
12  13 2011-01-01 03:00:00 2.417 
13  14 2011-01-01 03:15:00 2.492 
14  15 2011-01-01 03:30:00 2.611 
15  16 2011-01-01 03:45:00 2.785 
16  17 2011-01-01 04:00:00 3.020 
17  18 2011-01-01 04:15:00 3.314 
18  19 2011-01-01 04:30:00 3.665 
19  20 2011-01-01 04:45:00 4.059 
20  21 2011-01-01 05:00:00 4.483 

[21 rows x 3 columns] 
    number   datetime tide 
90  91 2011-01-01 22:30:00 7.329 
91  92 2011-01-01 22:45:00 7.014 
92  93 2011-01-01 23:00:00 6.690 
93  94 2011-01-01 23:15:00 6.352 
94  95 2011-01-01 23:30:00 6.016 
95  96 2011-01-01 23:45:00 5.690 
96  97 2011-02-01 00:00:00 5.366 
97  98 2011-02-01 00:15:00 5.043 
98  99 2011-02-01 00:30:00 4.729 
99  100 2011-02-01 00:45:00 4.426 
100  101 2011-02-01 01:00:00 4.123 
101  102 2011-02-01 01:15:00 3.832 
102  103 2011-02-01 01:30:00 3.562 
103  104 2011-02-01 01:45:00 3.303 
104  105 2011-02-01 02:00:00 3.055 
105  106 2011-02-01 02:15:00 2.827 
106  107 2011-02-01 02:30:00 2.620 
107  108 2011-02-01 02:45:00 2.434 
108  109 2011-02-01 03:00:00 2.268 
109  110 2011-02-01 03:15:00 2.141 
110  111 2011-02-01 03:30:00 2.060 

[21 rows x 3 columns] 
     number   datetime tide 
35020 35021 2011-12-31 19:00:00 5.123 
35021 35022 2011-12-31 19:15:00 4.838 
35022 35023 2011-12-31 19:30:00 4.551 
35023 35024 2011-12-31 19:45:00 4.279 
35024 35025 2011-12-31 20:00:00 4.033 
35025 35026 2011-12-31 20:15:00 3.803 
35026 35027 2011-12-31 20:30:00 3.617 
35027 35028 2011-12-31 20:45:00 3.438 
35028 35029 2011-12-31 21:00:00 3.278 
35029 35030 2011-12-31 21:15:00 3.141 
35030 35031 2011-12-31 21:30:00 3.019 
35031 35032 2011-12-31 21:45:00 2.942 
35032 35033 2011-12-31 22:00:00 2.909 
35033 35034 2011-12-31 22:15:00 2.918 
35034 35035 2011-12-31 22:30:00 2.923 
35035 35036 2011-12-31 22:45:00 2.985 
35036 35037 2011-12-31 23:00:00 3.075 
35037 35038 2011-12-31 23:15:00 3.242 
35038 35039 2011-12-31 23:30:00 3.442 
35039 35040 2011-12-31 23:45:00 3.671 

我無法解釋這一點。任何人都可以解釋發生了什麼,爲什麼會發生,我該如何糾正它?

在此先感謝。

菲爾

+0

嘗試在繪圖之前將您的熊貓數據系列轉換爲列表或numpy數組。 – tacaswell

+0

並查看列表形式中的一天變化。 – tacaswell

+0

你能發佈你的數據嗎?我無法用虛擬數據複製錯誤。 – horatio

回答

0

我一直無法複製你的錯誤,但或許我的工作啞代碼可以幫助診斷問題。我生成的僞數據,並使用此代碼繪製它:

import pandas as pd 
import numpy as np 

ydata = np.sin(np.linspace(0, 10, num=200)) 
time_index = pd.date_range(start=pd.datetime(2000, 1, 1, 0, 0), periods=200, freq=15*pd.datetools.Minute()) 
df = pd.DataFrame({'tides': ydata, 'datetime': time_index}) 
df.plot(x='datetime', y='tides') 

我的數據是這樣的

   datetime  tides 
0 2000-01-01 00:00:00 0.000000 
1 2000-01-01 00:15:00 0.050230 
2 2000-01-01 00:30:00 0.100333 
3 2000-01-01 00:45:00 0.150183 
4 2000-01-01 01:00:00 0.199654 

[200 rows] 

並生成以下情節

enter image description here

+0

非常感謝您花時間嘗試複製此問題。非常感謝。我目前離開辦公室,離開計算機和數據,但我會盡快在我回來後發佈數據。再次感謝。 – user1718097

1

衛生署!終於找到答案。原始的工作流程非常複雜。我將數據存儲在Excel電子表格中,並使用openpyxl從指定單元格範圍讀取數據。然後這被轉換成熊貓DataFrame。日期和時間變量使用pandas的.to_datetime()函數轉換爲日期時間格式。最後使用matplotlib繪製數據。當我準備將數據發佈到本論壇(如rauparaha所建議的)並將其腳本削減爲必需品時,我注意到Day1數據繪製於2011年1月1日,但Day2數據繪製於2011年2月1日。如果您查看原始帖子中的輸出,日期是混合格式:給出的最後日期是'2011-12-31'(即年月日),但2011年1月2日的第二日是'2011-02- 01'(即年 - 月 - 月)。

因此,看起來我誤解了pandas .to_datetime()函數如何解釋日期時間信息。我故意沒有設置infer_datetime_format屬性(默認= False),並假設任何問題都會被標記出來。但似乎熊貓假定日期是以月份爲先的格式。除非它們不是,在這種情況下,它會更改爲日期優先格式。我應該選擇那個!

我通過提供明確定義日期時間格式的字符串來糾正了這個問題。一切都很好。

再次感謝您的建議。併爲任何混淆道歉。

乾杯。