You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一Pandas DataFrame的日期范围为df1分配周数?

问题:根据日期范围为DataFrame分配对应周数

需要为df1添加Week #列,依据df2中定义的日期范围,将每个WorkDate匹配到对应的周数。

原始数据

df1

import pandas as pd

df1 = pd.DataFrame({
    'WorkDate': ['2022-05-03', '2022-05-16', '2022-05-24']
})
# 转换为日期类型
df1['WorkDate'] = pd.to_datetime(df1['WorkDate'])

df2

df2 = pd.DataFrame({
    'Week #': [1,2,3,4,5],
    'Week Start': ['2022-05-01', '2022-05-08', '2022-05-15', '2022-05-22', '2022-05-29'],
    'Week End': ['2022-05-07', '2022-05-14', '2022-05-21', '2022-05-28', '2022-06-04']
})
# 转换为日期类型
df2['Week Start'] = pd.to_datetime(df2['Week Start'])
df2['Week End'] = pd.to_datetime(df2['Week End'])

解决方案

方法1:使用merge_asof(高效推荐)

merge_asof适合按顺序匹配区间的场景,需先对df2按起始日期排序:

# 按Week Start排序df2
df2_sorted = df2.sort_values('Week Start')

# 执行asof合并
final_df = pd.merge_asof(df1.sort_values('WorkDate'), 
                         df2_sorted, 
                         left_on='WorkDate', 
                         right_on='Week Start',
                         direction='backward')

# 过滤并整理列
final_df = final_df[['WorkDate', 'Week #']].sort_values('WorkDate').reset_index(drop=True)

方法2:使用apply逐行判断

适合小数据量场景,直接判断日期所属区间:

def get_week_number(date):
    mask = (df2['Week Start'] <= date) & (df2['Week End'] >= date)
    return df2.loc[mask, 'Week #'].values[0]

df1['Week #'] = df1['WorkDate'].apply(get_week_number)
final_df = df1

方法3:使用pd.cut区间切割

将日期转为数值后,用区间规则匹配周数:

# 提取完整区间边界
bins = pd.concat([df2['Week Start'], df2['Week End'].iloc[-1:]]).sort_values()
labels = df2['Week #']

# 转换日期为数值并执行切割
df1['Week #'] = pd.cut(df1['WorkDate'].astype('int64'), 
                       bins=bins.astype('int64'), 
                       labels=labels, 
                       include_lowest=True)

final_df = df1

预期结果

print(final_df)
# 输出:
#    WorkDate  Week #
# 0 2022-05-03       1
# 1 2022-05-16       3
# 2 2022-05-24       4

内容的提问来源于stack exchange,提问作者AspiringDSer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:41:01