【问题标题】:Filling Pandas column between timestamp boundaries在时间戳边界之间填充 Pandas 列
【发布时间】:2021-02-13 16:54:16
【问题描述】:

让我们考虑一个带有时间戳列和第二列测量值的数据框。

    import pandas as pd

    data = {'Time':  [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
            'Value': [13,54,68,94,31,68,46,46,31,53,54,85,75,42,69]}

    df = pd.DataFrame (data, columns = ['Time','Value'])

我们希望过滤数据帧以仅保留特定时间的值。

    start = [2, 9, 14]
    end = [5, 12, 15]

在这种情况下,我们想要保留 3 个时间范围;从 2 秒到 5 秒,从 9 秒到 12 秒,从 14 秒到 15 秒。 我创建了一个列来标记我们想要保留的时间范围的边界。

    df.loc[df["Time"].isin(start), "Observation"] = 'Start'
    df.loc[df["Time"].isin(end), "Observation"] = 'End'

为了过滤行,我正在考虑填充 Start 和 End 之间的单元格,并删除空行。这就是我卡住的地方。

我尝试过使用:

    df = df.fillna(method='ffill')

这种方法的问题是我只需要在开始时应用此填充(以填充观察时间范围的内部),但我不想在“结束”之后填充。

我的第一个想法是创建另一组时间戳,它将获取会话结束的时间戳并将其加 1:

    import pandas as pd

    data = {'Time':  [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
            'Value': [13,54,68,94,31,68,46,46,31,53,54,85,75,42,69]}

    df = pd.DataFrame (data, columns = ['Time','Value'])

    start = [2, 9, 14]
    end = [5, 12, 15]
    out = [x+1 for x in end]

    df.loc[df["Time"].isin(start), "Observation"] = 'Start'
    df.loc[df["Time"].isin(end), "Observation"] = 'End'
    df.loc[df["Time"].isin(out), "Observation"] = 'Out'

    df = df.fillna(method='ffill')

这种方法的问题在于,对于我需要解决的问题,时间戳不是固定间隔的秒数。它是随机间隔的毫秒,所以使用这个 +1 来创建“Out”标签不是一种可靠的方法,而且感觉我把应该简单的事情复杂化了;只是保持开始时间戳和结束时间戳之间的观察(包括两个时间戳)。

可以选择使用过滤器 (filter/select rows of pandas dataframe by timestamp column)。但是,根据我正在查看的会话,可能会有随机数量的感兴趣的时间范围。我想尝试使用 for 循环扫描开始时间戳列表和结束时间戳列表来动态创建这样的过滤器,但我没有设法让它工作。

如果有人知道一个功能完全符合我的需要,或者有任何提示,那就太好了。

谢谢。

【问题讨论】:

    标签: python pandas autocomplete sections


    【解决方案1】:

    如何创建压缩startend 列表并检查元素是否在给定值对内的函数:

    def catch_df(start, end, element):
        start_end = zip(start, end)
        for i, z in enumerate(start_end):
            if element >= z[0] and element <= z[1]:
                return "df{}".format(i)
    

    并将该函数应用于存储在数据框df 中的值:

    df['Result'] = df['Time'].apply(lambda x: catch_df(start, end, x))
    

    因此,您会收到以下数据框,可以轻松过滤 None 值等:

        Time Value  Observation Result
    0   1    13     NaN         None
    1   2    54     Start       df0
    2   3    68     NaN         df0
    3   4    94     NaN         df0
    4   5    31     End         df0
    5   6    68     NaN         None
    6   7    46     NaN         None
    7   8    46     NaN         None
    8   9    31     Start       df1
    9   10   53     NaN         df1
    10  11   54     NaN         df1
    11  12   85     End         df1
    12  13   75     NaN         None
    13  14   42     Start       df2
    14  15   69     End         df2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 2022-01-24
      • 2019-12-05
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多