【问题标题】:Slice a Pandas dataframe with DatetimeIndex based on time interval基于时间间隔使用 DatetimeIndex 对 Pandas 数据帧进行切片
【发布时间】:2018-06-15 01:52:35
【问题描述】:

我正在努力完成以下工作......

我有一个 Pandas 数据框,它有许多条目,用 DatetimeIndex 索引,看起来有点像这样:

bro_df.info()

<class 'bat.log_to_dataframe.LogToDataFrame'>
DatetimeIndex: 3596641 entries, 2017-12-14 13:52:01.633070 to 2018-01-03 09:59:53.108566
Data columns (total 20 columns):
conn_state        object
duration          timedelta64[ns]
history           object
id.orig_h         object
id.orig_p         int64
id.resp_h         object
id.resp_p         int64
local_orig        bool
local_resp        bool
missed_bytes      int64
orig_bytes        int64
orig_ip_bytes     int64
orig_pkts         int64
proto             object
resp_bytes        int64
resp_ip_bytes     int64
resp_pkts         int64
service           object
tunnel_parents    object
uid               object
dtypes: bool(2), int64(9), object(8), timedelta64[ns](1)
memory usage: 528.2+ MB

我感兴趣的是获取此数据的一部分,该数据获取最后一个条目,在本例中为 2018-01-03 09:59:53.108566',然后从中减去一个小时。这应该会给我最后几个小时的条目。

到目前为止,我尝试做的事情如下:

last_entry = bro_df.index[-1:]
first_entry = last_entry - pd.Timedelta('1 hour')

这给了我看起来相当正确的值,根据:

print(first_entry)
print(last_entry)

DatetimeIndex(['2018-01-03 08:59:53.108566'], dtype='datetime64[ns]', name='ts', freq=None)
DatetimeIndex(['2018-01-03 09:59:53.108566'], dtype='datetime64[ns]', name='ts', freq=None)

这也是我卡住的地方。我用 bro_df.loc 和 bro_df.iloc 等尝试了各种方法,但我得到的只是数据类型的不同错误,而不是索引等。这让我认为我可能需要将 first_entry、last_entry 变量转换为其他类型?

或者我可能像往常一样完全找错树了。

任何帮助或指导将不胜感激。

干杯,迈克

【问题讨论】:

    标签: pandas datetime dataframe slice


    【解决方案1】:

    看来您需要通过索引[0] 创建标量并通过loc 选择:

    df = bro_df.loc[first_entry[0]: last_entry[0]]
    

    或通过exact indexing选择:

    df = bro_df[first_entry[0]: last_entry[0]]
    

    示例

    rng = pd.date_range('2017-04-03', periods=10, freq='2H 24T')
    bro_df = pd.DataFrame({'a': range(10)}, index=rng)  
    print (bro_df)
                         a
    2017-04-03 00:00:00  0
    2017-04-03 02:24:00  1
    2017-04-03 04:48:00  2
    2017-04-03 07:12:00  3
    2017-04-03 09:36:00  4
    2017-04-03 12:00:00  5
    2017-04-03 14:24:00  6
    2017-04-03 16:48:00  7
    2017-04-03 19:12:00  8
    2017-04-03 21:36:00  9
    

    last_entry = bro_df.index[-1:]
    first_entry = last_entry - pd.Timedelta('3 hour')
    print (last_entry)
    DatetimeIndex(['2017-04-03 21:36:00'], dtype='datetime64[ns]', freq='144T')
    
    print (first_entry)
    DatetimeIndex(['2017-04-03 18:36:00'], dtype='datetime64[ns]', freq=None)
    
    print (last_entry[0])
    2017-04-03 21:36:00
    
    print (first_entry[0])
    2017-04-03 18:36:00
    
    df = bro_df.loc[first_entry[0]: last_entry[0]]
    print (df)
                         a
    2017-04-03 19:12:00  8
    2017-04-03 21:36:00  9
    
    df1 = bro_df[first_entry[0]: last_entry[0]]
    print (df1)
                         a
    2017-04-03 19:12:00  8
    2017-04-03 21:36:00  9
    

    【讨论】:

    • 完美运行 - 再次感谢您提供快速而出色的解决方案!
    • 惊人的解决方案。让我免于恐慌。
    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2019-01-13
    相关资源
    最近更新 更多