python - 给定开始和结束日期的熊猫,将它们分成每周频率和计数
问题描述
我有开始数据和结束数据定义一个时期。我想将这些时期汇总为每周,并计算每周分配的天数。
我想我必须将 pd.cut 与每周的垃圾箱一起使用。我正在考虑先将期间转换为日期列。然后使用 group by id 和 resample 进行计数。我被困在将时间段转换为每日列中。
我很难通过遵循以列中的日期范围扩展熊猫数据框来获得所需的结果
# dataframe
prod_id = ['a', 'a', 'b', 'c']
start_date = ['2019-01-15', '2019-08-10', '2019-06-15', '2019-07-10']
end_date = ['2019-01-28', '2019-08-15', '2019-07-15', '2019-07-22']
d = {'id': prod_id, 'start': start_date, 'end': end_date}
df = pd.DataFrame.from_dict(d)
df = df[['id', 'start', 'end']]
df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])
# bins
freq = 'W'
bins = pd.date_range(pd.to_datetime('2018-10-01'), pd.to_datetime('2019-10-20'), freq=freq).tolist()
预期的结果类似于
解决方案
好的,我想我想出了一种解决方法。不是一个优雅的,所以仍在等待更好的解决方案。(特别不喜欢每天重新采样)
诀窍是引入另一列,因此可以为groupby单独区分重复的id。下面是代码
prod_id = ['a', 'a', 'b', 'c']
# add this to differetiate prod_id "a"
num_id = [1, 2, 3, 4]
start_date = ['2019-01-15', '2019-08-10', '2019-06-15', '2019-07-10']
end_date = ['2019-01-28', '2019-08-15', '2019-07-15', '2019-07-22']
d = {'id': prod_id, 'nd': num_id, 'start': start_date, 'end': end_date}
df = pd.DataFrame.from_dict(d)
df = df[['id', 'nd', 'start', 'end']]
df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])
df_melt = df.melt(id_vars=['id', 'nd'],value_name='date')
# first aggregate to daily
df_aggr_D = df_melt.groupby(['id', 'nd']).apply(lambda x: x.set_index('date').resample('D').pad()).drop(columns=['id','nd', 'variable']).reset_index()
df_aggr_D.drop(columns=['nd'], inplace=True)
# the aggregate to weekly
df_aggr_W = df_aggr_D.set_index('date').groupby('id').resample('W').count()
df_aggr_W.loc[df_aggr_W['id']!=0].rename(columns={'id':'count'})
推荐阅读
- javascript - 遍历 JS 中的所有 SVG 元素
- java - 如何将 OAEPParameterSpec 添加到 JWE 对象?
- android-studio - Admob Native 高级小添加尺寸
- graphql - 将默认/静态值从服务器传递到客户端
- mysql - 将连接器/NET 与连接池结合使用
- javascript - 获取 Cloud Firestore 数据库集合
- node.js - 为什么 puppeteer page.goto() 会抛出超时错误?
- angular - 格式化显示在 ag-grid 中的值
- php - PHP - 将 session_id 存储在 cookie 中安全吗?
- typescript - TypeScript AMD 模块继承不起作用