2016-11-22 55 views
0

我有一個csv文件,其中包含13年有關每天溫度的數據。現在我需要分散繪製這13年的數據。我希望x軸只有一年的日期(366天),以便每個日期的值可以顯示在同一日期,而不是一年。例如,August1st(87F)上的溫度可以顯示在同一個Y軸上,不管它在哪一年。這是如何工作的? 這就是數據的樣子:除了1980年,還有像1981年的其他年份也有8月1日。我希望他們的溫度在相同的y軸上 enter image description herePython:如何根據日期將多年的數據分散繪製到一年中

+1

你可以轉換您可以追溯到一年的一天http://stackoverflow.com/questions/620305/convert-year-month-year-of-year-in-python –

回答

0

如果您在日期中使用strptime讀取日期時間。你可以日期轉換你一年中的哪一天

Convert Year/Month/Day to Day of Year in Python

def day_of_year(date_string): 
    return datetime.datetime.strptime(date_string, '%Y%m%d').timetuple().tm_yday 

date_string = '19800801' 

day_of_year(date_string) 

>>> 214 
+0

哇,這有助於很多。我有另一個問題。我們如何設定第一天到9月30日,而不是默認的1月1日? –

1

正如你想的散點圖,一個方法是簡單地使用同一年從您的所有數據,並然後繪製中的所有條目說2016年(這是一個閏年)的日子範圍。

要讓起始範圍適用於特定的一天,請使用一年中的某一天來確定分割點。

這可以做如下:

from matplotlib import pyplot, dates 
from datetime import datetime 
import itertools 
data = [ 
    ["STATION", "DATE", "TMAX", "TMIN"], 
    ["X", "19800801", "87", "66"], 
    ["X", "19800801", "87", "72"], 
    ["X", "19800802", "88", "64"], 
    ["X", "19800802", "86", "68"], 
    ["X", "19800803", "80", "67"], 
    ["X", "19800804", "89", "63"], 
    ["X", "19800804", "88", "68"], 
    ["X", "19800805", "89", "72"], 
    ["X", "19800805", "88", "67"], 
    ["X", "19800806", "85", "66"], 

    # Some random data for 1984 (a leap year) 
    ["X", "19840101", "77", "66"], 
    ["X", "19840229", "77", "72"], 
    ["X", "19840302", "78", "64"], 
    ["X", "19840402", "76", "68"], 
    ["X", "19840503", "73", "67"], 
    ["X", "19840604", "79", "63"], 
    ["X", "19840704", "78", "68"], 
    ["X", "19840805", "79", "72"], 
    ["X", "19840805", "78", "67"], 
    ["X", "19841206", "75", "66"]] 

# Date range to map data onto 
d1 = datetime(year=2015, month=9, day=30) 
d365 = datetime(year=2016, month=9, day=29) 

yday = d1.timetuple().tm_yday # Start day of year 
pyplot.xlim(dates.date2num(d1), dates.date2num(d365)) 

axis_lookup = {} 

# Spread data over the selected range 
for s, d, tmax, tmin in data[1:]: 
    dt = datetime.strptime(d, '%Y%m%d') 
    year = int(dt.year) 
    print(year) 
    if dt.timetuple().tm_yday < yday: 
     dt = dt.replace(year=d365.year) 
    else: 
     dt = dt.replace(year=d1.year) 

    axis_lookup[year] = axis_lookup.get(year,{'x':[],'y':[]}) 
    axis_lookup[year]['x'].append(dt) 
    axis_lookup[year]['y'].append(tmax) 


ax = pyplot.gca() 
    # Convert to maplotlib format 
hfmt = dates.DateFormatter('%m') 
ax.xaxis.set_major_formatter(hfmt) 
ax.xaxis.set_major_locator(dates.MonthLocator()) 
colors = itertools.cycle(["r", "b", "g"]) 


pyplot.xlabel('Month') 
pyplot.ylabel('Temperature') 

for year,axes in axis_lookup.items(): 
    xaxis = dates.date2num(axes['x']) 
    pyplot.scatter(xaxis, axes['y'],color=next(colors), label=year,) 
pyplot.tight_layout() 
pyplot.legend() 
pyplot.show() 

給你的輸出:

sample output

+0

嗨:當我做了這樣的事情:[datetime.strptime(d [4:],'%m%d')s,d,tmax,tmin in data [1:]],它會給我錯誤:每月超出範圍。爲什麼會發生?我應該如何避免這種情況? –

+0

我認爲這是因爲1900年2月份沒有閏日,但我的數據有些年份是2月29日。那麼是否還有其他辦法可以在我的x軸中加入額外的一天,使其達到366天而不是365天?謝謝! –

+0

在這種情況下,發現並保持一年,但隨後以閏年取代它。我已經更新了腳本。 –

相關問題