【发布时间】:2019-01-13 07:01:21
【问题描述】:
我有一些时间序列数据作为 Pandas 数据框,从每小时过去 15 分钟和过去 45 分钟(时间间隔为 30 分钟)开始观察,然后将频率更改为每分钟。我想对数据进行重新采样,使其在整个数据帧的每 30 分钟、15 点和 45 点的常规频率。
我想到了两种方法来实现这一点。
1. 使用时间序列数据作为数据框中的一列,只需过滤 15 分钟和 45 分钟的所有观测值的数据框。
2. 重新设置索引,使时间序列数据成为多索引的一部分(索引的第 0 级是气象站,第 1 级是观测时间)并使用 Pandas 日期时间时间序列resample() 等功能。
原始数据框,天气,如下所示:
parsed_time Pressure Temp Hum
Station (index)
Bow 1 2018-04-15 14:15:00 1012 20.0 87
2 2018-04-15 14:45:00 1013 20.0 87
3 2018-04-15 15:15:00 1012 21.0 87
4 2018-04-15 15:45:00 1014 22.0 86
5 2018-04-15 16:00:00 1015 22.0 86
6 2018-04-15 16:01:00 1012 25.0 86
7 2018-04-15 16:02:00 1012 25.0 86
Stratford 8 2018-04-15 14:15:00 1011 18.0 87
9 2018-04-15 14:45:00 1011 18.0 87
10 2018-04-15 15:15:00 1012 18.0 87
11 2018-04-15 15:45:00 1014 19.0 86
12 2018-04-15 16:00:00 1014 19.0 86
13 2018-04-15 16:01:00 1015 19.0 86
14 2018-04-15 16:02:00 1016 20.0 86
15 2018-04-15 16:04:00 1016 20.0 86
使用方法 1,我的布尔选择操作似乎无法按预期工作。例如
weather_test = weather[weather['parsed_time'].dt.minute == (15 & 45)]
像这样给出 parsed_time 值:
2018-04-15 14:13:002018-04-15 15:13:00
weather_test = weather[weather['parsed_time'].dt.minute == (15 | 45)]
产生如下 parsed_time 值:
2018-04-15 14:47:002018-04-15 14:47:00
我在文档中找不到任何东西来解释这种行为。我想要的是以下时间点的压力、温度、湿度:
2018-04-15 14:45:00
2018-04-15 15:15:00
2018-04-15 15:45:00
2018-04-15 16:15:00
等等。
使用方法 2,我想对数据进行重新采样,以便用前 30 分钟的平均值替换我拥有每分钟数据的观察结果。此功能似乎仅在 parsed_time 列是索引的一部分时才有效,因此我使用以下代码将 parsed_time 设置为多索引的一部分:
weather.set_index('parsed_time', append=True, inplace=True)
weather.index.set_names('station', level=0, inplace=True)
weather = weather.reset_index(level=1, drop=True)
最终得到如下所示的数据框:
Pressure Temp Hum
Station parsed_time
Bow 2018-04-15 14:15:00 1012 20.0 87
2018-04-15 14:45:00 1013 20.0 87
2018-04-15 15:15:00 1012 21.0 87
2018-04-15 15:45:00 1014 22.0 86
2018-04-15 16:00:00 1015 22.0 86
2018-04-15 16:01:00 1012 25.0 86
2018-04-15 16:02:00 1012 25.0 86
Stratford 2018-04-15 14:15:00 1011 18.0 87
2018-04-15 14:45:00 1011 18.0 87
2018-04-15 15:15:00 1012 18.0 87
2018-04-15 15:45:00 1014 19.0 86
2018-04-15 16:00:00 1014 19.0 86
2018-04-15 16:01:00 1015 19.0 86
2018-04-15 16:02:00 1016 20.0 86
2018-04-15 16:04:00 1016 20.0 86
请注意,观测值的抽样从过去 :15 和 :45 的每 30 分钟到每分钟(例如 :01、:02、:14 等)不等,而且也因站而异 - 并非所有站都有每次观察。
我试过了:
weather_test = weather.resample('30min', level=1).mean()
但这会在没有偏移的情况下重新采样,并且还摆脱了多索引中的站点级别。
想要的结果是这样的:
Pressure Temp Hum
Station parsed_time
Bow 2018-04-15 14:15:00 1012 20.0 87
2018-04-15 14:45:00 1013 20.0 87
2018-04-15 15:15:00 1012 21.0 87
2018-04-15 15:45:00 1014 22.0 86
2018-04-15 16:15:00 1013 24.0 86
Stratford 2018-04-15 14:15:00 1011 18.0 87
2018-04-15 14:45:00 1011 18.0 87
2018-04-15 15:15:00 1012 18.0 87
2018-04-15 15:45:00 1014 19.0 86
2018-04-15 16:15:00 1015 19.5 86
每分钟的观测值已被重新采样为 30 分钟间隔内的平均值,时间为每小时 15 分和 45 分。
将站点作为多索引中的一个级别是必不可少的。我不能单独使用时间索引作为索引,因为每个站点的值都重复(并且不是唯一的)。
感谢所有帮助,因为我已经在这个圈子里转了一段时间。谢谢!
我看过很多以前的帖子,包括:
Boolean filter using a timestamp value on a dataframe in Python
How do I round datetime column to nearest quarter hour
和:Resampling a pandas dataframe with multi-index containing timeseries
对于应该很简单的事情来说,这似乎有点复杂......
和文档:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample.html 谢谢!
【问题讨论】:
标签: python pandas dataframe time-series multi-index