吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2467|回复: 10
收起左侧

[求助] python pandas,按时间段统计重复次数的问题

[复制链接]
cqwcns 发表于 2022-2-24 13:13
python pandas中,我有3列数据,分别是【工单编号】、【建单时间】、【宽带账号】,见图片。

我需要加一列【近30天内发生次数】,统计出该【宽带账号】往前30天出现的次数。
注意,是往前30天(不是一个自然月,也不是前后15天)。


以往,我有个代码是不考虑近30天,而是全部行都统计,代码是这样的:

[Python] 纯文本查看 复制代码
df['发生次数'] = df['建单时间'].groupby(df['宽带账号']).rank()


现在加了一个近30天的条件,就不知道怎么写了?求指教,谢谢


微信图片_20220224130643.png

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
zjs3.13 + 1 + 1 热心回复!
songfeichenhuan + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

SlowYan 发表于 2022-2-24 13:50
你可以获取它的建单时间,再天数减去三十,建立一个只有三十天记录的dataframe(如果是2月份的话,你就得考虑润平年了),在这个dataframe中运行你发去来的那一行代码。
songfeichenhuan 发表于 2022-2-24 14:22
d8349565 发表于 2022-2-24 16:41
1、获取今日日期
2、获取30天之前的日期
3、数据筛选时间大于第2条的日期。

[Python] 纯文本查看 复制代码
# 转换为时间
df["date"] = pd.to_datetime(df["date"])
# 获取年月日
df["year-month-day"] = df["date"].apply(lambda x: x.strftime("%Y-%m-%d"))
# 获取年
df["year"] = df["date"].apply(lambda x: x.strftime("%Y"))
# 获取月
df["month"] = df["date"].apply(lambda x: x.strftime("%m"))
# 获取日
df["day"] = df["date"].apply(lambda x: x.strftime("%d"))
# 获取月日
df["month-day"] = df["date"].apply(lambda x: x.strftime("%Y-%m"))
# 获取周
df['week'] = df['date'].apply(lambda x: x.strftime('%W'))
thepoy 发表于 2022-2-24 19:03
只用pandas做不到吧,给一个简单思路:
1. 用pandas对时间进行排序
2. 以宽带账号为 key 创建一个值为统计数字或时间列表的字典
3. 遍历所有 row,将时间小于今天-30的时间保存到列表里或统计数据加1
4. 如果字典的值是统计数字,可直接将字典按账号填充;如果字典的值是列表,len 一下列表即可。
cflying 发表于 2022-2-24 20:03
如果你的基础时间是固定的,比如表里的12-9,那这种好办,最笨的办法就是用每个时间和12-9相减,筛选出0~30之间的,统计同一号的个数就行,
或者直白点再新建一列,标注当日记录属于哪个日期的30天,然后按照日期的30天统计个数即可(其实这个和上面是一个意思)。
rsnodame 发表于 2022-3-3 23:00
你【建单时间】在pandas里的格式相信应该是pd.Timestamp类格式。可以直接算30天以前的的日期,然后条件筛选后计数

[Python] 纯文本查看 复制代码
a = pd.Timestamp('2022-1-1 9:24')
# Timestamp('2022-01-01 09:24:00')
b = pd.Timedelta(days=30)
c = a - b
# Timestamp('2021-12-02 09:24:00')

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
cqwcns + 1 + 1 谢谢@Thanks!

查看全部评分

rsnodame 发表于 2022-3-6 15:27
最近还发现个pandas的方法,似乎也符合你的需求

https://pandas.pydata.org/docs/r ... aFrame.between_time

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
cqwcns + 2 + 1 谢谢@Thanks!

查看全部评分

xyzman 发表于 2022-4-7 21:21
兄弟,这个问题解决了么?能分享下代码不?多谢多谢!
 楼主| cqwcns 发表于 2022-4-13 21:10
xyzman 发表于 2022-4-7 21:21
兄弟,这个问题解决了么?能分享下代码不?多谢多谢!

def count_number(x):
    this_data = df[
        (df['建单时间'] > str(x.建单时间 - pd.Timedelta(days=30))) &
        (df['建单时间'] <= str(x.建单时间))]
    return len(this_data[this_data['宽带账号'] == x.宽带账号])


print('统计周期内次数')
df['周期内次数'] = df.apply(lambda x: count_number(x), axis=1)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
xyzman + 1 + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表