看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
时间窗口指的是在一段时间内对数据进行分析的时间段,通常是一个连续的时间段,如一小时、一天、一周或一个月等。在分析时间序列数据时,时间窗口的选择通常会影响分析结果和预测精度。本例中,将用 pandas 对风向进行时间窗口的分析。
风向是指风的方向,通常用度或角度来表示。在气象学和环境监测中,风向是一个重要的指标,可以用来了解风对空气质量和环境的影响。
风向是环境监测中的一个重要指标,通过分析风向可以了解风对空气质量和环境的影响,同时也可以制定相应的防治措施。
具体来说,分析风向有以下几个方面的用途:
因此,分析风向对于环境保护和公众健康具有重要的意义,可以帮助制定有效的防治措施,保障生态环境和人类健康。
构造数据如下:
import pandas as pd
from io import StringIO
data = '''
time,wd
2015/3/2 00:00,NW
2015/3/2 01:00,NW
2015/3/2 02:00,NW
2015/3/2 03:00,NW
2015/3/2 04:00,WNW
2015/3/2 05:00,NNE
2015/3/2 06:00,NNE
2015/3/2 07:00,S
2015/3/2 08:00,SSE
2015/3/2 09:00,S
'''
df = pd.read_csv(StringIO(data), parse_dates=[0])
df
# ...
索引是记录数据的时间,wd 是 wind direction 的缩写,代表风向。需求需要知道以六个小时为窗口,在这个移动窗口中,最多的风向是什么,有多少次(频数),分别增加两列来表示。
先将 time 列转为索引,应用 rolling() 方法创建一个移动窗口对象,这个对象的每个元素是窗口内的 Series。然后将这个窗口对象构造成 Series,每个值就是窗口对象中的元素(Series)。
接着,对每个元素映射处理,用 Series 的 value_counts() 方法获得值及频数,并取得这个首个索引和值,索引为最多的风向,值为此风向出现的数量,将这两个值组成一个元素,用于后期构造两个值。
将得到的元组序列构造为一个 DataFrame,它们分别各为一列,最后与原数据拼接在一起,便得到了最后的结果。
根据思路先构造窗口对象:
ro = (
df.astype({'time': 'datetime64[ns]'})
.set_index('time')
.rolling('6H')
)
ro
# Rolling [window=6H,min_periods=1,center=False,
# win_type=freq,axis=0,method=single]
然后将窗口对象构造为 Series,并映射处理:
data = (
pd.Series(ro)
.map(lambda x: x.wd.value_counts())
# 此处处理了窗口小于 6 的情况
.map(lambda x: (x.index[0], x[0]) if x.sum()>=6 else (None, None))
)
data
'''
0 (None, None)
1 (None, None)
2 (None, None)
3 (None, None)
4 (None, None)
5 (NW, 4)
6 (NW, 3)
7 (NW, 2)
8 (NNE, 2)
9 (NNE, 2)
dtype: object
'''
得到一个值类型为元组的 Series,将它转换为 DataFrame:
data.apply(pd.Series)
'''
0 1
0 None NaN
1 None NaN
2 None NaN
3 None NaN
4 None NaN
5 NW 4.0
6 NW 3.0
7 NW 2.0
8 NNE 2.0
9 NNE 2.0
'''
设置列名:
data.apply(pd.Series).set_axis(['max_wd', 'max_counts'], axis=1)
'''
max_wd max_counts
0 None NaN
1 None NaN
2 None NaN
3 None NaN
4 None NaN
5 NW 4.0
6 NW 3.0
7 NW 2.0
8 NNE 2.0
9 NNE 2.0
'''
最后,将它与原数据拼接在一起:
df.join(data.apply(pd.Series).set_axis(['max_wd', 'max_counts'], axis=1))
'''
time wd max_wd max_counts
0 2015-03-02 00:00:00 NW None NaN
1 2015-03-02 01:00:00 NW None NaN
2 2015-03-02 02:00:00 NW None NaN
3 2015-03-02 03:00:00 NW None NaN
4 2015-03-02 04:00:00 WNW None NaN
5 2015-03-02 05:00:00 NNE NW 4.0
6 2015-03-02 06:00:00 NNE NW 3.0
7 2015-03-02 07:00:00 S NW 2.0
8 2015-03-02 08:00:00 SSE NNE 2.0
9 2015-03-02 09:00:00 S NNE 2.0
'''
这样就得到了我们想要的结果。
(完)
更新时间:2024-08-18 16:12:29 标签:pandas python 时间窗口