2021-05-01

对某一列进行操作

对DataFrame 对某一列求和 

输入:

   index times
0     10   100
1     20   200
2     30   300
3     40   400
输出:

sum_int = 100
sum_str = '100200300400'
 Python 用 sum 函数实现:

import pandas as pd
 
dt = {'index': [10, 20, 30, 40], 'times': ['100', '200', '300', '400'], }
df = pd.DataFrame(dt)
 
sum_int = df['index'].sum()
sum_str = df['times'].sum()

 

截取符合条件的行

获得a列中值为1的行
data[data['a'].isin([1])]


获得a列中值为1或2的行
data[data['a'].isin([1,2])]


获得a列中值大于1、小于2的行
data[(data['a']<2)&(data['a']>1)]


同时,Pandas也提供了query()方法来对DataFrame进行过滤。

DataFrame.query(expr, inplace=False, **kwargs)


参数
expr:引用字符串形式的表达式以过滤数据。
inplace:如果该值为True, 它将在原始DataFrame中进行更改。

获得a列中值为1的行
data.query('a==1')


获得a列中值为1或2的行
data.query('a==1 | a==2')


获得a列中值大于1、小于2的行
data.query('2>a>1')

 

 

如果以数字 0 作为十进制整数的开头,就会报SyntaxError异常,错误提示信息为:leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers

data_0401=data_source[data_source['结团时间']=='2021-04-01']
# 时间也要加引号

 

 

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

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

 

如获取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']<close_day
order_data[con1&con2]

 

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

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

 

 

但如果是需要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)]
 

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

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

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的函数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.
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值