为了账号安全,请及时绑定邮箱和手机立即绑定

将开始时间和结束时间作为过滤器应用于数据框

将开始时间和结束时间作为过滤器应用于数据框

九州编程 2023-04-25 17:50:30
我正在处理一个时间序列数据框,它看起来像这样,并且包含从 2020 年 1 月到 2020 年 8 月的数据。    Timestamp            Value    2020-01-01 00:00:00 -68.95370    2020-01-01 00:05:00 -67.90175    2020-01-01 00:10:00 -67.45966    2020-01-01 00:15:00 -67.07624    2020-01-01 00:20:00 -67.30549    .....    2020-07-01 00:00:00 -65.34212我正在尝试使用下面数据框中的 start_time 和 end_time 列对前一个数据帧应用过滤器:  start_time            end_time 2020-01-12 16:15:00 2020-01-13 16:00:00 2020-01-26 16:00:00 2020-01-26 16:10:00 2020-04-12 16:00:00 2020-04-13 16:00:00 2020-04-20 16:00:00 2020-04-21 16:00:00 2020-05-02 16:00:00 2020-05-03 16:00:00输出应将所有不在开始和结束时间范围内的值分配为零,并保留过滤器中指定的开始和结束时间的值。我尝试对开始时间和结束时间同时应用两个过滤器,但没有用。任何帮助,将不胜感激。
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

想法是在列表理解中创建所有掩码Series.between,然后加入logical_orbynp.logical_or.reduce并最后传递给Series.where

print (df1)

            Timestamp     Value

0 2020-01-13 00:00:00 -68.95370 <- changed data for match

1 2020-01-01 00:05:00 -67.90175

2 2020-01-01 00:10:00 -67.45966

3 2020-01-01 00:15:00 -67.07624

4 2020-01-01 00:20:00 -67.30549

5 2020-07-01 00:00:00 -65.34212


L = [df1['Timestamp'].between(s, e) for s, e in df2[['start_time','end_time']].values]

m = np.logical_or.reduce(L)


df1['Value'] = df1['Value'].where(m, 0)

print (df1)

            Timestamp    Value

0 2020-01-13 00:00:00 -68.9537

1 2020-01-01 00:05:00   0.0000

2 2020-01-01 00:10:00   0.0000

3 2020-01-01 00:15:00   0.0000

4 2020-01-01 00:20:00   0.0000

5 2020-07-01 00:00:00   0.0000


查看完整回答
反对 回复 2023-04-25
?
POPMUISE

TA贡献1765条经验 获得超5个赞

使用合并方法和查询的外部连接的解决方案:

print(df1)

            timestamp     Value <- changed Timestamp to timestamp to avoid name conflict in query

0 2020-01-13 00:00:00 -68.95370 <- also changed data for match

1 2020-01-01 00:05:00 -67.90175

2 2020-01-01 00:10:00 -67.45966

3 2020-01-01 00:15:00 -67.07624

4 2020-01-01 00:20:00 -67.30549

5 2020-07-01 00:00:00 -65.34212


df1.loc[df1.index.difference(df1.assign(key=0).merge(df2.assign(key=0), how = 'outer')\

           .query("timestamp >= start_time and timestamp < end_time").index),"Value"] = 0

结果:


            timestamp    Value

0 2020-01-13 00:00:00 -68.9537

1 2020-01-01 00:05:00   0.0000

2 2020-01-01 00:10:00   0.0000

3 2020-01-01 00:15:00   0.0000

4 2020-01-01 00:20:00   0.0000

5 2020-07-01 00:00:00   0.0000

键assign(key=0)被添加到两个数据帧以产生笛卡尔积。


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信