【问题标题】:how to get missing timestamps between the earliest value of day and latest value of day?如何在一天的最早值和一天的最新值之间获取缺失的时间戳?
【发布时间】:2020-11-17 03:37:42
【问题描述】:

df 包含带有 NaN 的索引(故意)。 它包含许多 5 分钟邮票的每日范围,但有时这些范围内会出现漏洞。

有没有办法获取最早时间戳(= 一天中最早的时间戳)和最晚时间(= 一天中最晚的时间戳)之间缺失的时间戳?

我的意思是,例如,我的时间序列可以从每天 4:35 开始,到 23:30 结束,但有时甚至一天的开头或结尾都可能丢失。 (因为这是一天中最早的时间值和该索引上“曾经”的最新时间值,有没有办法用秒来做到这一点,以便它保持动态?)

Time                 Vals
2019-06-17 08:45:00   NaN 
2019-06-17 08:50:00   NaN 
2019-06-17 08:55:00   NaN 
2019-06-17 09:00:00   NaN 
2019-06-17 09:05:00   NaN 
2019-06-17 09:10:00   NaN 
2019-06-17 09:15:00   NaN 
2019-06-17 09:20:00   NaN 
2019-06-17 09:25:00   NaN 
2019-06-17 09:30:00   NaN 
2019-06-17 09:35:00   NaN 
2019-06-17 09:40:00   NaN 
2019-06-17 09:45:00   NaN 
2019-06-17 09:50:00   NaN 
2019-06-17 09:55:00   NaN 
2019-06-17 10:00:00   NaN 
2019-06-17 10:05:00   NaN 
2019-06-17 10:10:00   NaN 
2019-06-17 10:15:00   NaN 
2019-06-17 10:20:00   NaN 
Name: Vals, dtype: float64

ix = pd.to_datetime(pd.Index("2019-06-17 08:45:00","2019-06-17 08:50:00","2019-06-17 08:55:00","2019-06-17 09:00:00","2019-06-17 09:05:00","2019-06-17 09:10:00","2019-06-17 09:15:00","2019-06-17 09:20:00","2019-06-17 09:25:00","2019-06-17 09:30:00","2019-06-17 09:35:00","2019-06-17 09:40:00","2019-06-17 09:45:00","2019-06-17 09:50:00","2019-06-17 09:55:00","2019-06-17 10:00:00","2019-06-17 10:05:00","2019-06-17 10:10:00","2019-06-17 10:15:00","2019-06-17 10:20:00")
 

(最后它需要再次成为熊猫日期时间索引)

编辑:(避免误解)

上面的索引实际上由 数百万天组成,其中一些在它们开始和结束的“范围”之间存在一些漏洞。这些开始和结束之间的时间戳漏洞需要添加(而范围之外的时间应该添加)。 有没有一种方法可以有效地做到这一点,而无需手动为每个范围执行此操作?

可以获取最早的白天(例如 04:35)和最晚的时间(例如 22:45),然后每天填写这些范围。 但是如何在数百万天的时间内以有效的方式做到这一点

【问题讨论】:

    标签: python pandas datetime time interpolation


    【解决方案1】:

    听起来这个问题可以改写如下:如果一个特定的时间戳存在一天,它应该存在一整天。如果我对问题的理解正确,请告诉我。

    如果这是你所追求的,你可以

    1. 获取唯一的日期和时间
    2. 根据这些日期和时间的笛卡尔积构建一个新索引
    3. 使用pd.DataFrame.reindex

    假设您的数据存储在名为 df 的 DataFrame 中,您可以这样实现:

    import pandas as pd
    from datetime import datetime
    
    # change index to date-time MultiIndex
    df.index = pd.MultiIndex.from_tuples(zip(df.index.date,df.index.time))
    
    # get unique dates and times
    dates = df.index.get_level_values(0).unique()
    times = df.index.get_level_values(1).unique() # <- time intervals are defined here
    
    # create new index from cartesian product of dates and times
    idx = pd.MultiIndex.from_product([dates,times])
    df = df.reindex(idx)
    
    # back to original index format: reduce MultiIndex to 1D datetime index, sort
    df.index = [datetime.combine(date,time) for date,time in df.index.values]
    df = df.sort_index()
    

    编辑:cmets 中要求的替代时间

    如果时间间隔遵循另一个规则(例如,如果您想要示例中的固定间隔,或者特定的开始和结束值),您可以相应地更改times 的定义。例如,如果您希望每天每五分钟有一个条目,请将以 times = ... 开头的行替换为以下表达式:

    times = pd.date_range(start="2000-01-01 00:00", end="2000-01-01 23:59", freq="5T").time
    

    示例(基准版本)

    输入:

    df = pd.DataFrame({'Vals':range(6)})
    df.index =  pd.to_datetime(pd.Index(["2019-06-17 08:45:00",
                                         "2019-06-17 08:50:00",
                                         "2019-06-17 08:55:00",
                                         "2019-06-17 09:00:00",
                                         "2019-06-18 08:40:00",
                                         "2019-06-18 08:55:00"]))
    print(df)
                         Vals
    2019-06-17 08:45:00     0
    2019-06-17 08:50:00     1
    2019-06-17 08:55:00     2
    2019-06-17 09:00:00     3
    2019-06-18 08:40:00     4
    2019-06-18 08:55:00     5
    

    输出:

    print(df)
                         Vals
    2019-06-17 08:40:00   NaN
    2019-06-17 08:45:00   0.0
    2019-06-17 08:50:00   1.0
    2019-06-17 08:55:00   2.0
    2019-06-17 09:00:00   3.0
    2019-06-18 08:40:00   4.0
    2019-06-18 08:45:00   NaN
    2019-06-18 08:50:00   NaN
    2019-06-18 08:55:00   5.0
    2019-06-18 09:00:00   NaN
    

    【讨论】:

    • 您能否准确地描述“您可以相应地更改时间的定义。”您的意思?否则结果看起来还不错。我计划通过选择一个我想“清理”的 df 的特定子选择来做到这一点,然后通过 union() 和 reindex() 将新的赢得时间戳附加到整个索引。
    • 另外:有没有办法在每天的 00:00 到 23:59(仅限)包含的日期执行此操作? (以防一整天之后需要提取并用不同的方法清洁)
    • 在 00:00 到 23:59 之间索引应该遵循哪些规则?例如。你想要一个固定的时间间隔,比如5分钟吗?现有输入是否保证在这些时间间隔内?
    • 固定间隔,是的。在 00:00 和 23:59 的情况下,现有输入不能保证在这些时间间隔内。实际上,这种做法是填充数据集中完全没有表示的所有范围。
    • @JulietVictor 好像是 24/? (而不是 24/7)每 5 分钟一次,但仅限于已包含的日期。
    【解决方案2】:

    你不能只使用.head(1).tail(1) 函数吗?所以在这个例子中 df[‘Time’].head(1) 和 tail 一样。

    【讨论】:

    • 我猜不是直接的,因为实际上索引由多天组成。因此,索引中出现的最早白天必须按小时分钟和秒计算。
    • 啊,我明白了,我不太确定你怎么能做到这一点
    【解决方案3】:

    听起来,pandas date_range 可能与此相关: 例如。如果你想获得一个日期的时间序列和你提到的时间,你 可以试试:

    pd.date_range(start="2019-06-17 04:35", end="2019-06-17 23:30", freq="5T")
    

    【讨论】:

    • 我猜我上面的文字可能不够清楚,(因为索引实际上包含数百万天)有没有办法在白天有效地做到这一点? (比如:每天(8:30 到 18:30)?
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2020-04-30
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多