【问题标题】:How can I filter for rows one hour before and after a set timestamp in Python?如何在 Python 中设置时间戳前后一小时过滤行?
【发布时间】:2021-07-21 10:55:20
【问题描述】:

我正在尝试过滤 DataFrame 以仅显示指定时间/日期之前 1 小时和之后 1 小时的值,但我无法找到合适的函数。我正在与 Pandas 一起使用 Python。

我看到的有关按日期屏蔽的帖子主要涉及屏蔽指定开始日期和结束日期之间的行的情况,但我无法找到有关如何根据单个日期屏蔽行的帮助。

我将时间序列数据作为 DataFrame 跨越大约一年,因此有数千行。该数据以 1 分钟为间隔,因此每一行对应一个行 ID、一个时间戳和一个值。

DataFrame 示例:

ID            timestamp  value
 0  2011-01-15 03:25:00     34
 1  2011-01-15 03:26:00     36
 2  2011-01-15 03:27:00     37
 3  2011-01-15 03:28:00     37
 4  2011-01-15 03:29:00     39
 5  2011-01-15 03:30:00     29
 6  2011-01-15 03:31:00     28
...

我正在尝试创建一个函数,该函数输出作为初始 DataFrame 的 DataFrame,但仅在指定时间戳之前 1 小时和之后 1 小时的行,因此仅在此指定的 2 小时窗口内的行。

为了更清楚:

我有一个 DataFrame,其中包含一年中的 1 分钟间隔数据(如上例所示)。

我现在确定一个特定的时间戳:2011-07-14 06:15:00

我现在想输出一个作为初始输入 DataFrame 的 DataFrame,但现在只包含 2011-07-14 06:15:00 之前 1 小时内和 2011-07-14 之后 1 小时内的行06:15:00。

你知道我该怎么做吗?我知道我可以创建一个过滤器,在其中删除 2011-07-14 05:15:00 和 2011-07-14 07:15:00 之前的所有值,但我的目标是让用户只需输入单个日期/时间(例如 2011-07-14 06:15:00)来生成输出 DataFrame。

这是我迄今为止尝试过的:

hour = pd.DateOffset(hours=1)
date = pd.Timestamp("2011-07-14 06:15:00")
df = df.set_index("timestamp")
df([date - hour: date + hour])

返回:

File "<ipython-input-49-d42254baba8f>", line 4
    df([date - hour: date + hour])
                   ^
SyntaxError: invalid syntax

我不确定这是否真的只是一个语法错误,还是更深更复杂的问题。我该如何解决这个问题?

谢谢!

【问题讨论】:

    标签: python dataframe filter timestamp offset


    【解决方案1】:

    你可以这样做:

    import pandas as pd
    import datetime as dt
    
    data = {"date": ["2011-01-15 03:10:00","2011-01-15 03:40:00","2011-01-15 04:10:00","2011-01-15 04:40:00","2011-01-15 05:10:00","2011-01-15 07:10:00"],
            "value":[1,2,3,4,5,6]}
    
    df=pd.DataFrame(data)
    
    df['date']=pd.to_datetime(df['date'], format='%Y-%m-%d %H:%M:%S', errors='ignore')
    
    
    date_search= dt.datetime.strptime("2011-01-15 05:20:00",'%Y-%m-%d %H:%M:%S')
    mask = (df['date'] > date_search-dt.timedelta(hours = 1)) & (df['date'] <= date_search+dt.timedelta(hours = 1))
    print(df.loc[mask])
    

    结果:

                     date  value
    3 2011-01-15 04:40:00      4
    4 2011-01-15 05:10:00      5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 2012-04-17
      • 1970-01-01
      • 2017-05-18
      • 2018-07-17
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多