如何解决当时间增量不恒定时,跟踪固定时间窗口内有多少观察值
我有一个数据框,其中的观测值按时间索引,但观测值之间的时间差不是恒定的。
df
>>>
TimeStamp x1 x2
1 2015-03-01 19:05:01 0.812 18.23
2 2015-03-01 19:22:17 0.121 13.91
3 2015-03-01 19:24:34 0.822 15.10
4 2015-03-01 19:28:53 0.093 22.38
5 2015-03-01 21:49:57 0.291 22.90
6 2015-03-01 23:59:01 0.672 23.12
7 2015-03-02 02:30:01 0.421 28.56
8 2015-03-02 02:30:01 0.591 31.72
9 2015-03-02 02:31:17 0.811 21.71
10 2015-03-02 04:37:19 0.142 16.39
我想计算每个样本在固定时间窗口内的观察次数。
如果我的时间窗口是 10 分钟,那么我想计算 [0,2,1,0] 因为在第一个样本的 10 分钟内观察到 0 个样本,2在第二个样品的 10 分钟内观察到样品,在第三个样品的 10 分钟内观察到 1 个样品,依此类推。可能存在两个观察同时发生的情况,但它们是不同的观察(如 7 和 8)。
如果我的时间窗口是 1 小时,那么我想计算 [3,0] 因为在第一个样本的 1 小时内观察到 3 个样本,所以
我有一个函数可以做到这一点,但有两个问题; 1) 它非常慢,因为它逐行迭代数据 2) 有时返回的计数是负数,我觉得这很奇怪,因为 timedelta 总是 >= 0。
import pandas as pd
import datetime as dt
def get_count(data: pd.DataFrame,window_hours: int,window_minutes: int) -> np.ndarray:
# we only want to iterate to the sample that is within window_hours + window_minutes from the end
last_sample = data["TimeStamp"].iloc[-1] - dt.timedelta(days=0,hours=window_hours,minutes=window_minutes)
count = np.empty(len(data[data["TimeStamp"] <= last_sample]),dtype=int)
i = 0
for index,row in data[data["TimeStamp"] <= last_day].iterrows():
idx = np.where(data["TimeStamp"] <= (row["TimeStamp"] + dt.timedelta(days=0,minutes=window_minutes)))[0][-1]
tmp = idx - index
count[i] = tmp
i += 1
return count
有没有办法使用纯 Pandas / numpy(避免 for 循环)来做到这一点,以便它更快,并提供所需的输出,而我的方法似乎没有?
解决方法
- 使用面具然后
count()
- 灵活,如参数 Timedelta
df = pd.read_csv(io.StringIO(""" TimeStamp x1 x2
1 2015-03-01 19:05:01 0.812 18.23
2 2015-03-01 19:22:17 0.121 13.91
3 2015-03-01 19:24:34 0.822 15.10
4 2015-03-01 19:28:53 0.093 22.38
5 2015-03-01 21:49:57 0.291 22.90
6 2015-03-01 23:59:01 0.672 23.12
7 2015-03-02 02:30:01 0.421 28.56
8 2015-03-02 02:30:01 0.591 31.72
9 2015-03-02 02:31:17 0.811 21.71
10 2015-03-02 04:37:19 0.142 16.39"""),sep="\s\s+",engine="python")
df.TimeStamp = pd.to_datetime(df.TimeStamp)
def within(dfa,**kwargs):
return dfa.TimeStamp.apply(lambda t: dfa.loc[dfa.TimeStamp.gt(t) &
dfa.TimeStamp.le(t+pd.Timedelta(**kwargs)),"TimeStamp"].count())
df["10min"] = within(df,minutes=10)
df["4hour"] = within(df,hours=4)
时间戳 | x1 | x2 | 10 分钟 | 4 小时 | |
---|---|---|---|---|---|
1 | 2015-03-01 19:05:01 | 0.812 | 18.23 | 0 | 4 |
2 | 2015-03-01 19:22:17 | 0.121 | 13.91 | 2 | 3 |
3 | 2015-03-01 19:24:34 | 0.822 | 15.1 | 1 | 2 |
4 | 2015-03-01 19:28:53 | 0.093 | 22.38 | 0 | 1 |
5 | 2015-03-01 21:49:57 | 0.291 | 22.9 | 0 | 1 |
6 | 2015-03-01 23:59:01 | 0.672 | 23.12 | 0 | 3 |
7 | 2015-03-02 02:30:01 | 0.421 | 28.56 | 1 | 2 |
8 | 2015-03-02 02:30:01 | 0.591 | 31.72 | 1 | 2 |
9 | 2015-03-02 02:31:17 | 0.811 | 21.71 | 0 | 1 |
10 | 2015-03-02 04:37:19 | 0.142 | 16.39 | 0 | 0 |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。