【发布时间】:2019-05-13 14:08:48
【问题描述】:
当列 A 的值在一周内最高时,如何将值 1 分配给变量 S?另外,当B的值是一周内的最小值时,如何将值2分配给变量S。我正在处理按日期时间索引的每小时数据。 这是我的数据框的样子:
A B S
datetime
6/14/2004 1:00 384.5 383.6 0
6/14/2004 2:00 384.3 382.3 0
6/14/2004 3:00 383.3 382.3 0
6/14/2004 4:00 383.3 382.6 0
6/14/2004 5:00 383.3 382.8 0
6/14/2004 6:00 383.3 382.5 0
6/14/2004 7:00 383.3 382.3 0
6/14/2004 8:00 383.8 382.3 0
6/14/2004 9:00 382.8 382.1 0
6/14/2004 10:00 382.6 382.1 0
我尝试过每周使用重采样并获得最大值,但我不知道如何编写代码,因为它比我最初想象的要复杂。 这是我希望我的最终数据看起来的样子。
A B S
datetime
6/14/2004 1:00 384.5 383.6 0
6/14/2004 2:00 384.3 382.3 0
6/14/2004 3:00 383.3 382.3 0
6/14/2004 4:00 383.3 382.6 0
6/14/2004 5:00 383.3 382.8 0
6/14/2004 6:00 383.3 382.5 0
6/14/2004 7:00 383.3 382.3 0
6/14/2004 8:00 383.8 382.3 0
6/14/2004 9:00 382.8 382.1 0
6/14/2004 10:00 382.6 382.1 0
6/14/2004 11:00 382.5 381.8 0
6/14/2004 12:00 382.8 382.3 0
6/14/2004 13:00 383.1 382.3 0
6/14/2004 14:00 385.8 382.5 0
6/14/2004 15:00 385.1 383.6 0
6/14/2004 16:00 384.8 383.5 0
6/14/2004 17:00 384.8 382.5 0
6/14/2004 18:00 383.6 382.8 0
6/14/2004 19:00 383.8 382.8 0
6/14/2004 20:00 383.3 382.8 0
6/14/2004 21:00 383.1 382.6 0
6/14/2004 22:00 383.1 382.6 0
6/14/2004 23:00 383.1 382.6 0
6/15/2004 0:00 382.8 382.6 0
6/15/2004 1:00 383.3 382.6 0
6/15/2004 2:00 383.6 382.3 0
6/15/2004 3:00 383.8 382.5 0
6/15/2004 4:00 382.8 382.1 0
6/15/2004 5:00 383.0 382.1 0
6/15/2004 6:00 382.8 382.0 0
... ... ... ...
6/24/2004 20:00 402.8 401.8 0
6/24/2004 21:00 402.3 401.8 0
6/24/2004 22:00 402.3 401.8 0
6/24/2004 23:00 402.1 401.1 0
6/25/2004 0:00 402.1 401.8 0
6/25/2004 1:00 402.1 401.3 0
6/25/2004 2:00 402.1 400.1 0
6/25/2004 3:00 401.6 400.8 0
6/25/2004 4:00 401.5 400.8 0
6/25/2004 5:00 401.3 400.8 0
6/25/2004 6:00 401.1 400.6 0
6/25/2004 7:00 402.1 400.8 0
6/25/2004 8:00 402.1 400.6 0
6/25/2004 9:00 401.6 400.5 0
6/25/2004 10:00 401.8 400.8 0
6/25/2004 11:00 401.5 400.6 0
6/25/2004 12:00 401.3 400.1 0
6/25/2004 13:00 402.8 401.3 0
6/25/2004 14:00 402.8 401.0 **1**
6/25/2004 15:00 401.5 400.1 0
6/25/2004 16:00 401.6 400.6 0
6/25/2004 17:00 401.8 401.0 0
6/25/2004 18:00 402.1 400.8 0
6/25/2004 19:00 402.3 400.8 0
6/25/2004 20:00 402.6 401.6 0
6/25/2004 21:00 401.8 401.3 0
6/25/2004 22:00 401.8 400.6 0
6/28/2004 0:00 401.8 401.6 0
6/28/2004 1:00 402.3 401.6 0
6/28/2004 2:00 402.3 401.5 0
对于第一周,S 列在 2004 年 6 月 18 日 18:00 的值为 1,在 2004 年 6 月 15 日 11:00 的值为 2 对于第二周,S 列在 6/25/2004 14:00 的值为 1,在 6/21/2004 18:00
的值为 2我想出了四个规则:
1. 当 A = max(A) 在当前周内,将值 1 放入 S。如果 A 最大值在一周内不是唯一的,则将 1 放入 S 中的最后一次出现A中的最大值。
2. 当 B = min(B) 在当前周内,将值 2 放入 S。如果 B 最小值在一周内不唯一,则将 2 放入 S 中最后一次出现的位置B中的最小值。
3. 在整个星期内重复此操作。整个数据集每小时可能有 80k+ 数据行。
4.每周内:如果 max(A) 和 min(B) 出现在同一日期时间索引处,则将值 0 留在 S 中(不变)。
下面是读取数据的代码:
import pandas as pd
url = 'https://www.dropbox.com/s/x7wl75rkzsqgkoj/dataset.csv?dl=1'
p = pd.read_csv(url)
p.set_index('datetime', drop=True, inplace=True)
p
这是一张图片,解释了我希望输出的样子:
【问题讨论】:
-
请在发帖前阅读此内容; How to Ask,minimal reproducible example。不要发布图片,请复制/粘贴代码并以任何人都可以用来复制您的流程的格式输入数据。
-
我想这是我的第一个问题......
-
嗯,图像比长复制粘贴更有帮助。你的问题得到了很好的解决。你可以缩短你的样本。
标签: python pandas time-series resampling