cqwcns 发表于 2022-2-24 13:13

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

python pandas中,我有3列数据,分别是【工单编号】、【建单时间】、【宽带账号】,见图片。

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


以往,我有个代码是不考虑近30天,而是全部行都统计,代码是这样的:
df['发生次数'] = df['建单时间'].groupby(df['宽带账号']).rank()

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


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条的日期。

# 转换为时间
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天以前的的日期,然后条件筛选后计数

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')

rsnodame 发表于 2022-3-6 15:27

最近还发现个pandas的方法,似乎也符合你的需求

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.between_time.html#pandas.DataFrame.between_time

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 == x.宽带账号])


print('统计周期内次数')
df['周期内次数'] = df.apply(lambda x: count_number(x), axis=1)
页: [1] 2
查看完整版本: python pandas,按时间段统计重复次数的问题