python pandas,按时间段统计重复次数的问题
python pandas中,我有3列数据,分别是【工单编号】、【建单时间】、【宽带账号】,见图片。我需要加一列【近30天内发生次数】,统计出该【宽带账号】往前30天出现的次数。
注意,是往前30天(不是一个自然月,也不是前后15天)。
以往,我有个代码是不考虑近30天,而是全部行都统计,代码是这样的:
df['发生次数'] = df['建单时间'].groupby(df['宽带账号']).rank()
现在加了一个近30天的条件,就不知道怎么写了?求指教,谢谢
你可以获取它的建单时间,再天数减去三十,建立一个只有三十天记录的dataframe(如果是2月份的话,你就得考虑润平年了),在这个dataframe中运行你发去来的那一行代码。 我不太会这个东西 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')) 只用pandas做不到吧,给一个简单思路:
1. 用pandas对时间进行排序
2. 以宽带账号为 key 创建一个值为统计数字或时间列表的字典
3. 遍历所有 row,将时间小于今天-30的时间保存到列表里或统计数据加1
4. 如果字典的值是统计数字,可直接将字典按账号填充;如果字典的值是列表,len 一下列表即可。 如果你的基础时间是固定的,比如表里的12-9,那这种好办,最笨的办法就是用每个时间和12-9相减,筛选出0~30之间的,统计同一号的个数就行,
或者直白点再新建一列,标注当日记录属于哪个日期的30天,然后按照日期的30天统计个数即可(其实这个和上面是一个意思)。 你【建单时间】在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')
最近还发现个pandas的方法,似乎也符合你的需求
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.between_time.html#pandas.DataFrame.between_time 兄弟,这个问题解决了么?能分享下代码不?多谢多谢! 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