pandas多行合并一行_如何用pandas提取指定时间段的数据

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

先构造一个数据集

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

如获取1月到4月份的数据

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

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

open_day='2020-01-02'close_day='2020-01-13'con1=order_data['start_time']>=open_daycon2=order_data['start_time']order_data[con1&con2]
214eb62c11423556e98c43f697730f8c.png

如果是获取每一天的某个时间段,是整点的话(如6:00-22:00)也可以获取hour来判断

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

但如果是需要6:00-8:30呢,这就有点麻烦了,经过我实验,可以有下面两种:

import pandas as pdfrom dateutil import parseropen_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 Falseorder_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)]

3da9baa2be9a56d8153ca2042200cb0f.png

但是这种合规的有点,每一次都需要用原来的日期加上时间构造来判断

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

import pandas as pdorder_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_timecon2=order_data['time_judge']<=close_timeorder_data[con1&con2]
09760e009342f09554abaa6f9d6bb751.png

最近在知乎上看到一个pandas的函数between_time可以直接做这个事情 适用于任意时间段,整点不整点无所谓,还是官方的方法舒服

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.between_time.html#pandas.DataFrame.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函数还有一种用法是把区间左端点设置的比右端点大,这样就是选择不包括在[右端点,左端点]之间的数据

374bd856127001213b693757b1e2d6ab.png
推荐阅读

• pandas小妙招• pandas之按类多行合并为一行• pandas使用的100个trick• 一个插件让你告别谷歌学术镜像• 基于conv-lstm方法预测共享单车需求


4ad3e032728f753a1c5cfc5f4db05542.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值