【问题标题】:Python pandas, how to truncate DatetimeIndex and fill missing data only in certain intervalPython pandas,如何截断 DatetimeIndex 并仅在特定间隔内填充缺失的数据
【发布时间】:2013-01-18 05:51:07
【问题描述】:
 2012-10-08 07:12:22            0.0    0          0  2315.6    0     0.0    0
 2012-10-08 09:14:00         2306.4   20  326586240  2306.4  472  2306.8    4
 2012-10-08 09:15:00         2306.8   34  249805440  2306.8  361  2308.0   26
 2012-10-08 09:15:01         2308.0    1   53309040  2307.4   77  2308.6    9
 2012-10-08 09:15:01.500000  2308.2    1  124630140  2307.0  180  2308.4    1
 2012-10-08 09:15:02         2307.0    5   85846260  2308.2  124  2308.0    9
 2012-10-08 09:15:02.500000  2307.0    3  128073540  2307.0  185  2307.6   11
 ......
 2012-10-09 07:19:30            0.0    0          0  2276.6    0     0.0    0
 2012-10-09 09:14:00         2283.2   80   98634240  2283.2  144  2283.4    1
 2012-10-09 09:15:00         2285.2   18  126814260  2285.2  185  2285.6    3
 2012-10-09 09:15:01         2285.8    6   98719560  2286.8  144  2287.0   25
 2012-10-09 09:15:01.500000  2287.0   36  144759420  2288.8  211  2289.0    4
 2012-10-09 09:15:02         2287.4    6  109829280  2287.4  160  2288.6    5
 ......

我有一个 DataFrame,其中包含上述几天的交易所交易数据。我想要的数据来自9:00:00AM - 11:30:00AM13:00:00 - 15:15:00,所以我想做两件事,

  1. 对于 DataFrame 中的每个日期,将其截断为仅在 9:00:00AM - 11:30:00AM13:00:00 - 15:15:00 的范围
  2. 范围在1.,以500 milliseconds的频率填充缺失数据

pandas 截断函数只允许我根据日期截断,但我想在这里根据 datetime.time 截断。 还有如何仅在我感兴趣的区间内填充缺失的数据。

非常感谢。

【问题讨论】:

    标签: python datetime dataframe pandas truncate


    【解决方案1】:
    1. 对于 DataFrame 中的每个日期,将其截断为仅包含 9:00:00AM - 11:30:00AM 和 13:00:00 - 15:15:00 范围内的数据

    为此使用索引slicing,例如:

    df = df[start_timestamp:end_timestamp]
    
    1. 范围为1.,以500毫秒的频率填充缺失数据

    生成一个索引为 500 毫秒的新数据帧。 Merge 此数据框与使用外连接的原始数据框。这会为您提供一个包含定期行的数据框。缺失观察的行将包含 NaN 值。然后用 fillna 填充缺失的 NaN 值。

    例子:

    In [1]: import pandas as pd
    
    In [2]: import numpy as np
    
    In [3]: data = pd.DataFrame({"value": np.arange(5)}, index=pd.date_range("2013/02/03", periods=5, freq="3Min"))
    
    In [4]: data
    Out[4]: 
                         value
    2013-02-03 00:00:00      0
    2013-02-03 00:03:00      1
    2013-02-03 00:06:00      2
    2013-02-03 00:09:00      3
    2013-02-03 00:12:00      4
    
    In [5]: filler = pd.DataFrame({"value": [100] * 15}, index=pd.date_range("2013/02/03", periods=15, freq="1Min"))                                                                           
    
    In [6]: filler
    Out[6]: 
                         value
    2013-02-03 00:00:00    100
    2013-02-03 00:01:00    100
    2013-02-03 00:02:00    100
    2013-02-03 00:03:00    100
    2013-02-03 00:04:00    100
    2013-02-03 00:05:00    100
    2013-02-03 00:06:00    100
    2013-02-03 00:07:00    100
    2013-02-03 00:08:00    100
    2013-02-03 00:09:00    100
    2013-02-03 00:10:00    100
    2013-02-03 00:11:00    100
    2013-02-03 00:12:00    100
    2013-02-03 00:13:00    100
    2013-02-03 00:14:00    100
    
    In [7]: merged = filler.merge(data, how='left', left_index=True, right_index=True)                                                                                                         
    
    In [8]: merged["value"] = np.where(np.isfinite(merged.value_y), merged.value_y, merged.value_x)                                                                                            
    
    In [9]: merged
    Out[9]: 
                         value_x  value_y  value
    2013-02-03 00:00:00      100        0      0
    2013-02-03 00:01:00      100      NaN    100
    2013-02-03 00:02:00      100      NaN    100
    2013-02-03 00:03:00      100        1      1
    2013-02-03 00:04:00      100      NaN    100
    2013-02-03 00:05:00      100      NaN    100
    2013-02-03 00:06:00      100        2      2
    2013-02-03 00:07:00      100      NaN    100
    2013-02-03 00:08:00      100      NaN    100
    2013-02-03 00:09:00      100        3      3
    2013-02-03 00:10:00      100      NaN    100
    2013-02-03 00:11:00      100      NaN    100
    2013-02-03 00:12:00      100        4      4
    2013-02-03 00:13:00      100      NaN    100
    2013-02-03 00:14:00      100      NaN    100
    
    In [10]: merged['2013-02-03 00:01:00':'2013-02-03 00:10:00']                                                                                                                                
    Out[10]: 
                         value_x  value_y  value
    2013-02-03 00:01:00      100      NaN    100
    2013-02-03 00:02:00      100      NaN    100
    2013-02-03 00:03:00      100        1      1
    2013-02-03 00:04:00      100      NaN    100
    2013-02-03 00:05:00      100      NaN    100
    2013-02-03 00:06:00      100        2      2
    2013-02-03 00:07:00      100      NaN    100
    2013-02-03 00:08:00      100      NaN    100
    2013-02-03 00:09:00      100        3      3
    2013-02-03 00:10:00      100      NaN    100
    

    【讨论】:

    • 谢谢,你可以看到我的索引是完整时间戳的形式,比如2012-10-08 07:12:22,你的[start_timestamp:end_timestamp]是datetime.time的形式吗?如果是,它似乎不起作用。它会抛出一个无效的切片异常。
    • @tesla1060 添加了一个完整的例子
    • 感谢这个例子,它解决了我的第二个问题。但是第一个,你处理它的方式是merged['2013-02-03 00:01:00':'2013-02-03 00:10:00'],你假设你知道日期是2013-02-03,我的问题是我有多个日期,在每个日期,我想要来自00:01:00的数据到00:10:00,除了指定完整的时间戳['2013-02-03 00:01:00':'2013-02-03 00:10:00'] 之外,有没有更简单的方法来实现这一点,但也许只使用 datetime.time 部分['00:01:00':'00:10:00']
    • @tesla1060 你可能可以创建一个两级索引['date','time'],然后对第二级应用时间过滤,但这已经超出了我目前的pandas-fu水平。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2022-11-02
    • 2021-11-12
    • 2018-05-16
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多