如何用pandas提取指定时间段的数据

处理数据时,经常用到的一个需求是:从全部数据中提取某个时间段内的数据

先构造一个数据集

import pandas as pd
import numpy as np
i = pd.date_range('2020-01-01', periods=10000, freq='30min')
order_data= pd.DataFrame({'value': np.arange(0,10000),,"start_time":i})

如何用pandas提取指定时间段的数据_第1张图片
如获取1月到4月份的数据

order_data[order_data['start_time'].dt.month.isin(np.arange(1, 5))]

如何用pandas提取指定时间段的数据_第2张图片

如获取2020-01-02到2020-01-12的数据

open_day='2020-01-02'
close_day='2020-01-13'
con1=order_data['start_time']>=open_day
con2=order_data['start_time']

如何用pandas提取指定时间段的数据_第3张图片
如果是获取每一天的某个时间段,是整点的话(如6:00-22:00)也可以获取hour来判断

order_data[order_data['start_time'].dt.hour.isin(np.arange(6, 22))]

如何用pandas提取指定时间段的数据_第4张图片
但如果是需要6:00-8:30呢,这就有点麻烦了,经过我实验,可以有下面两种:

import pandas as pd
from dateutil import parser
open_time='06:00'
close_time='08:30'
def is_needtime(x):
    con1=x.start_time >= parser.parse(x.date+" "+ open_time)
    con2=x.start_time <= parser.parse(x.date+" "+ close_time)
    if con1&con2:
        return True
    else:
        return False

order_data['start_time'] = pd.to_datetime(order_data['start_time'], format="%Y/%m/%d %H:%M:%S")
order_data['date']=order_data['start_time'].apply(lambda x: x.strftime('%Y/%m/%d'))
order_data[order_data.apply(is_needtime,axis=1)]

如何用pandas提取指定时间段的数据_第5张图片
但是这种合规的有点,每一次都需要用原来的日期加上时间构造来判断

另一种有点歪路子的方法是我们把时间提取出来,然后统一加上某一天,构造出来一列专门用于判断的带日期的时间列(推荐这种

import pandas as pd
order_data['start_time'] = pd.to_datetime(order_data['start_time'], format="%Y/%m/%d %H:%M:%S")
order_data['time_judge'] =order_data['start_time'].apply(lambda x: "2020-01-01"+" "+x.strftime('%H:%M'))
order_data['time_judge'] = pd.to_datetime(order_data['time_judge'], format="%Y-%m-%d %H:%M:%S")
open_time='2020-01-01 06:00'
close_time='2020-01-01 08:30'
con1=order_data['time_judge']>=open_time
con2=order_data['time_judge']<=close_time
order_data[con1&con2]

如何用pandas提取指定时间段的数据_第6张图片
最近在知乎上看到一个pandas的函数between_time可以直接做这个事情
适用于任意时间段,整点不整点无所谓

Parameters
start_timedatetime.time or str
end_timedatetime.time or str
include_startbool, default True
include_endbool, default True

axis{0 or ‘index’, 1 or ‘columns’}, default 0
New in version 0.24.0.

可以看到默认设置是区间两端都是闭区间

  • 6:00-22:00
order_data.set_index("start_time").between_time("06:00", "22:00")
  • 6:00-08:30
order_data.set_index("start_time").between_time("06:00", "08:30")

between_time函数还有一种用法是把区间左端点设置的比右端点大,这样就是选择不包括在[右端点,左端点]之间的数据
如何用pandas提取指定时间段的数据_第7张图片
如何用pandas提取指定时间段的数据_第8张图片

你可能感兴趣的:(pandas,Python)