来自Pandas Dataframe的多个时间序列图

时间:2016-03-22 02:35:25

标签: python pandas matplotlib plot

我正在尝试使用pandas编写我的第一个python脚本。我有10年的风数据(1分钟读数),我需要创建每月地块,并在每个地块上绘制速度和方向。

输入csv数据如下所示:

Date,Speed,Dir,
2014-01-01 00:00:00, 13, 179,
2014-01-01 00:01:00, 13, 178,
2014-01-01 00:02:00, 11, 169,
2014-01-01 00:03:00, 11, 178,
2014-01-01 00:04:00, 11, 181,

到目前为止,我已经写了下面的内容,这会创建一个在日期范围内设置的月份的情节。我对这个情节看起来很满意,除了我需要修复x轴标签。

我想遍历整个数据集并为每个月创建一个pdf图。任何帮助这样做将不胜感激!

import glob, os
import pandas as pd
from pandas import Series, DataFrame, Panel
import numpy as np
import matplotlib.pyplot as plt

wind = pd.read_csv('2014.csv')

wind['Date']=pd.to_datetime(wind['Date'])
wind=wind.set_index('Date')

dates = pd.date_range('2014-01', '2014-2', freq='1min')

janwin = Series(wind['Speed'], index=dates)
jandir = Series(wind['Dir'], index=dates)

plt.figure(1)
plt.subplot(211)
plt.plot(dates, janwin)

plt.ylabel("Km/hr")
plt.rcParams.update({'font.size': 4})
plt.grid(which='major', alpha = .5)


plt.subplot(212)
plt.plot(dates, jandir)
plt.ylabel("Degrees")
plt.rcParams.update({'font.size': 4})
plt.grid(which='major', alpha = 5)
plt.ylim(0,360)
plt.axis(minor=True) 

plt.savefig('test.pdf', dpi=900)

Sample Plot

2 个答案:

答案 0 :(得分:1)

欢迎使用Stackoverflow。通常情况下,当您在这类问题上寻求帮助时,最好先工作,直到您遇到特定的实例/问题,然后寻求帮助。很难告诉你如何做这么广泛的事情,往往你不会得到很好的回应,因为你似乎只是在懒惰并寻求帮助而不是全力以赴解决问题的方法。我看到了你需要解决的一些问题,但是你需要设置一个循环并找出如何开始/停止循环,以及如何只绘制你当前感兴趣的月份的数据。< / p>

下面是我从内存中快速写的一些示例代码(还没有运行),我确定有更好的方法可以做到这一点,但希望它会让你走上正确的轨道。将来,如果您可以将帖子提取到基本部分,您将获得最佳答案。在这种情况下,每天两个月的样本数据框将有助于进行迭代/绘图。然后,您可以使用工作代码并调整为分钟。

如果这有用,请竖起大拇指并努力确保此处列出的最终代码对您关注的人有用。

import pandas as pd
import matplotlib.pyplot as plt
import datetime
from dateutil.relativedelta import relativedelta
import calendar

#wind = pd.read_csv('2014.csv')
data = [['2014-01-01 00:00:00', 13, 179],
        ['2014-01-01 00:01:00', 13, 178],['2014-01-01 00:02:00', 11, 169],['2014-01-01 00:03:00', 11, 178], 
        ['2014-01-01 00:04:00', 11, 181]]

rawDf = pd.DataFrame(data, columns = ['Date','Speed','Dir'])

rawDf['Date']=pd.to_datetime(rawDf['Date'])

#Define beginning and end of loop - start at first month, end at last month
currDate = datetime.date(rawDf['Date'].min().year, rawDf['Date'].min().month, 1)
endDate = datetime.date(rawDf['Date'].max().year, rawDf['Date'].max().month, 1)


#loop
while currDate <= endDate:

    currMoEnd = datetime.date(currDate.year, currDate.month, calendar.monthrange(currDate.year,currDate.month)[1])
    wind = rawDf[(rawDf['Date']>= currDate) & (rawDf['Date']<= currMoEnd)]
    wind.set_index('Date', inplace = True)

    dates = pd.date_range(currDate, currMoEnd, freq='1min')

    janwin = pd.Series(wind['Speed'], index=dates)
    jandir = pd.Series(wind['Dir'], index=dates)

    plt.figure(1)
    plt.subplot(211)
    plt.plot(dates, janwin)

    plt.ylabel("Km/hr")
    plt.rcParams.update({'font.size': 4})
    plt.grid(which='major', alpha = .5)


    plt.subplot(212)
    plt.plot(dates, jandir)
    plt.ylabel("Degrees")
    plt.rcParams.update({'font.size': 4})
    plt.grid(which='major', alpha = 5)
    plt.ylim(0,360)
    plt.axis(minor=True) 

    plt.show()
    plt.savefig('{0}_output.pdf'.format(datetime.stftime(currDate,'%Y-%m')),  dpi=900)

    currDate = currDate + relativedelta(months = 1)

答案 1 :(得分:1)

非常感谢flyingmeatball向我展示如何循环访问数据。我通过我的第一个脚本学到了很多东西,希望它对其他人来说是一个有用的参考。

下面的代码读入包含1分钟平均风向数据的csv,其中包含日期/时间字段,并绘制包含每个月的速度和方向的时间序列的数字。

编辑:自发布以来我注意到以下情况将数据绘制到该月最后一天的第一个时间戳(缺少~24小时的数据)。这是因为CurrMoEnd仅返回日期。

#Plots monthly wind speed data from 1min average recordings to PDF
import pandas as pd
import matplotlib.pyplot as plt
import datetime
from dateutil.relativedelta import relativedelta
import calendar


data = pd.read_csv('data.csv')

data['Date']=pd.to_datetime(data['Date'])

rawDf = pd.DataFrame(data, columns = ['Date','Speed','Dir'])


#Define beginning and end of loop - start at first month, end at last month
currDate = datetime.date(rawDf['Date'].min().year, rawDf['Date'].min().month, 1)
endDate = datetime.date(rawDf['Date'].max().year, rawDf['Date'].max().month, 1)


#loop through and plot each month of data
while currDate <= endDate:

currMoEnd = datetime.date(currDate.year, currDate.month, calendar.monthrange(currDate.year,currDate.month)[1])
wind = rawDf[(rawDf['Date']>= currDate) & (rawDf['Date']<= currMoEnd)]
wind.set_index('Date', inplace = True)

dates = pd.date_range(currDate, currMoEnd, freq='1min')

win = pd.Series(wind['Speed'], index=dates)
dirc = pd.Series(wind['Dir'], index=dates)

#Set figure size roughly to A4 paper size
plt.figure(1, figsize = (11.3, 8))

plt.subplot(211)
plt.plot(dates, win, lw = 0.15)
plt.ylabel("Km/hr")
plt.rcParams.update({'font.size': 4})
plt.grid(which='major')


plt.subplot(212)
plt.plot(dates, dirc, lw = 0.15)
plt.ylabel("Degrees")
plt.rcParams.update({'font.size': 4})
plt.grid(which='major')
plt.yticks([0, 45, 90, 135, 180, 225, 270, 315, 360])
plt.ylim(0,360)
plt.axis(minor=True) 

#convert current month to for file name
month = int(currDate.strftime('%m'))
year= int(currDate.strftime('%Y'))

#Plot PDF to current directory/year/month output.pdf
plt.savefig("{}/{} Output.pdf".format(year, month), dpi = 900)
plt.show()

#increment current date    
currDate = currDate + relativedelta(months = 1)