时间序列食谱¶
日期 | 2008-12-05 (最后修改), 2008-04-08 (创建) |
---|
<TableOfContents(4)>
注意:开发人员的官方文档和重要说明可以在 timseries scikit sourceforge 页面 中找到。
常见问题解答¶
一般性话题¶
1. 时间序列分析 -
http://article.gmane.org/gmane.comp.python.scientific.user/13949
\ 1. 时间序列:Python vs. R URL 缺失!!!
\ 1. 时间序列包的路线图/计划 -
http://permalink.gmane.org/gmane.comp.python.scientific.user/14599
读取数据并创建时间序列对象¶
屏蔽 NoData 值¶
问题¶
在我的原始数据中,nodata 值用 "-999" 标记。如何导入数据或创建时间序列并从进一步处理中排除这些无数据点?(在时间序列中标记无数据 - http://permalink.gmane.org/gmane.comp.python.scientific.user/14455)
答案¶
* 使用 masked_where 来自 maskedarray
#!python
myvalues_ts_hourly = masked_where(myvalues_ts_hourly , -999)
* 使用 索引
#!python
myvalues_ts_hourly[myvalues_ts_hourly==-999] = M.masked
更详细的答案¶
* 开始示例数据 (tmp.txt) *
date;hour_of_day;value
01.02.2004;1;247
01.02.2004;2;889
01.02.2004;3;914
01.02.2004;4;292
01.02.2004;5;183
01.02.2004;6;251
01.02.2004;7;953
01.02.2004;8;156
01.02.2004;9;991
01.02.2004;10;557
01.02.2004;11;581
01.02.2004;12;354
01.02.2004;13;485
01.02.2004;14;655
01.02.2004;15;-999
01.02.2004;16;-999
01.02.2004;17;-999
01.02.2004;18;744
01.02.2004;19;445
01.02.2004;20;374
01.02.2004;21;168
01.02.2004;22;995
01.02.2004;23;943
01.02.2004;24;326
02.02.2004;1;83.98
02.02.2004;2;302.26
02.02.2004;3;310.76
02.02.2004;4;-999
02.02.2004;5;62.22
02.02.2004;6;85.34
02.02.2004;7;324.02
02.02.2004;8;53.04
02.02.2004;9;336.94
02.02.2004;10;189.38
02.02.2004;11;197.54
02.02.2004;12;120.36
02.02.2004;13;164.9
02.02.2004;14;222.7
02.02.2004;15;34.74
02.02.2004;16;85.34
02.02.2004;17;53.04
02.02.2004;18;252.96
02.02.2004;19;151.3
02.02.2004;20;-999
02.02.2004;21;57.12
02.02.2004;22;338.3
02.02.2004;23;320.62
02.02.2004;24;110.84}}}
'''* END SAMPLE DATA *'''
{{{
#!python
import numpy as N
import maskedarray as M
import timeseries as ts
data = N.loadtxt("tmp.txt", dtype='|S10', skiprows=2)
dates = ts.date_array([ts.Date(freq='H',string="%s %s:00" %
(d[0],int(d[1])-1))
for d in data],
freq='H')
series = ts.time_series(data[:,-1].astype(N.float_),
dates,
mask=(data[:,-1]=='-999'))
频率¶
问题¶
是否存在至少一年高时间分辨率的示例数据集:15 分钟或至少 1 小时。拥有这样一个通用数据集,人们可以设置教程示例并更容易地调试或提出问题,因为所有人都将拥有磁盘上的相同(非机密)数据。
答案¶
对于小时,您有“hourly”频率。对于 15 分钟,您有“minutely”频率,您可以从中选择每隔 15 个点。
(参见:时间序列包的路线图/计划 - http://permalink.gmane.org/gmane.comp.python.scientific.user/1459)
一天中的小时¶
(参见:时间序列中一天小时的分配 - http://permalink.gmane.org/gmane.comp.python.scientific.user/14597) 当交换汇总数据集(例如,具有每小时频率)时,数据通常以如下方式呈现:所需报告输出
date; hour_of_day; value
1-Feb-2004;1:00;247
1-Feb-2004;2:00;889
1-Feb-2004;3:00;914
1-Feb-2004;4:00;292
1-Feb-2004;5:00;183
1-Feb-2004;6:00;251
1-Feb-2004;7:00;953
1-Feb-2004;8:00;156
1-Feb-2004;9:00;991
1-Feb-2004;10:00;557
1-Feb-2004;11:00;581
1-Feb-2004;12:00;354
1-Feb-2004;13:00;485
1-Feb-2004;14:00;655
1-Feb-2004;15:00;862
1-Feb-2004;16:00;399
1-Feb-2004;17:00;598
1-Feb-2004;18:00;744
1-Feb-2004;19:00;445
1-Feb-2004;20:00;374
1-Feb-2004;21:00;168
1-Feb-2004;22:00;995
1-Feb-2004;23:00;943
1-Feb-2004;24:00;326
这种格式可能是某些记录设备的结果,例如,这些设备记录了以 16 秒采样率的设备获取的 5 分钟平均值。同样,由科学模型或遥感信息创建的合成数据集也可以具有这种格式。在创建时间序列对象时,应将开始小时内部设置为零 (0),以实现小时的正确分配(01:00 h 是 00:00 h - 01:00 h 期间的结束 => 此期间的数据从 00:00 h 开始)。对于输出,可以像下面答案中所示的那样进行自定义。Python 内置模块 datetime 可以在这里提供帮助。
问题¶
我有每小时的测量值,其中小时 1 代表 0:00-1:00 期间的结束,2 代表 1:00-2:00 期间的结束,...,24 代表 23:00 到 24:00 期间的结束。
当我绘制从 2 月到 11 月的这些每小时时间序列时,由于这个问题,曲线会继续延伸到 12 月。时间序列然后假设 12 月 0:00 的值为 0,这会导致错误的绘制行为。
我希望实现小时 24 作为一天的最后测量周期,而不是作为下一天的第一个测量周期(如 0:00)。
答案¶
由于时间“24:00”实际上并不存在(据我所知),您将不得不依靠某种技巧来获得所需的输出。试试这个
#!python
import timeseries as ts
series = ts.time_series(range(400, 430), start_date=ts.now('hourly'))
hours = ts.time_series(series.hour + 1, dates=series.dates)
hour_fmtfunc = lambda x : '%i:00' % x
ts.Report(hours, series, datefmt='%d-%b-%Y', delim=' ', fmtfunc=[None hour_fmtfunc,])()
date time; value
06-Jan-2008 23:00; 400
06-Jan-2008 24:00; 401
07-Jan-2008 1:00; 402
07-Jan-2008 2:00; 403
07-Jan-2008 3:00; 404
07-Jan-2008 4:00; 405
07-Jan-2008 5:00; 406
07-Jan-2008 6:00; 407
07-Jan-2008 7:00; 408
07-Jan-2008 8:00; 409
07-Jan-2008 9:00; 410
07-Jan-2008 10:00; 411
07-Jan-2008 11:00; 412
07-Jan-2008 12:00; 413
07-Jan-2008 13:00; 414
07-Jan-2008 14:00; 415
07-Jan-2008 15:00; 416
07-Jan-2008 16:00; 417
07-Jan-2008 17:00; 418
07-Jan-2008 18:00; 419
07-Jan-2008 19:00; 420
07-Jan-2008 20:00; 421
07-Jan-2008 21:00; 422
07-Jan-2008 22:00; 423
07-Jan-2008 23:00; 424
07-Jan-2008 24:00; 425
08-Jan-2008 1:00; 426
08-Jan-2008 2:00; 427
08-Jan-2008 3:00; 428
08-Jan-2008 4:00; 429
时间序列的操作和操作
使用时间序列的日期时间信息¶
(参见:时间序列包的路线图/计划 - http://permalink.gmane.org/gmane.comp.python.scientific.user/14598) 一个例子
问题¶
必须获得凌晨的降雨强度。对于这样的过滤器,需要有关相应小时的信息。
答案¶
import timeseries as ts
data = ts.time_series(range(100), start_date=ts.today('hourly'))
hours = data.hour
filtered_data = data[(hours < 7) & (hours > 3)]
filtered_data
timeseries([80 6 7 8 30 31 32 54 55 56 78 79],
dates = [07-Jan-2008 04:00 07-Jan-2008 05:00 07-Jan-2008 06:00
08-Jan-2008 04:00 08-Jan-2008 05:00 08-Jan-2008 06:00 09-Jan-2008 04:00
09-Jan-2008 05:00 09-Jan-2008 06:00 10-Jan-2008 04:00 10-Jan-2008 05:00
10-Jan-2008 06:00],
freq = H)
#!python
In: myvalues_ts_daily
Out:
timeseries([ 1.4 89.4 3.5 ..., 11.5 1.6
0. ],
dates = [01-Dec-2006 01-Feb-1995 ...],
freq = D)
我想要的是一个只包含每日平均值数组。另外,我希望得到一个类似报告的数组输出,格式为“日期 值”。
1 3
2 11
1. possibility #2:
If you don't use the keyword func, you end up with a 2d array, each row being a day, each column an hour. Just use maskedarray.mean on each row avgdata = convert(data,'D').mean(-1)
If you only want the values, use the .series attribute, it will give you a view of the array as a MaskedArray.
== Plotting ==
Word of caution... the timeseries plotting stuff does not currently support frequencies higher than daily (eg. hourly, minutely, etc...). Support for these frequencies could be added without too much trouble, but just haven't got around to it yet. (Cf. Re: roadmap/plans for timeseries package - http://permalink.gmane.org/gmane.comp.python.scientific.user/14598)
= About this page =
== Source ==
* Most information presented here has been compiled from discussions at the scipy mailing list.
== todo ==
* Use one data set consistently for the examples
* offer the code for download
章节作者:TimMichelsen、MattKnox、Unknown[148]