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

如何在Pandas中根据日期从另一个DataFrame添加新列

问题描述

现有两个DataFrame:

df1(逐日日期数据)

ABDate
xa03-10-2022
yb02-10-2022
zc01-10-2022
td30-09-2022
ke29-09-2022
hf28-09-2022
ug27-09-2022

df2(周度日期数据)

unnamed14-10-202207-10-202230-09-202223-09-2022
xaaaaaaaaaa
ybbbbbbbbbb
rates30.224.827.633.1
zcccccccccc

需要将df2中的rates行作为新列Rates添加到df1中,并按照日期区间匹配:

  • 14-10-2022及以后:30.2
  • 07-10-2022至13-10-2022:24.8
  • 30-09-2022至06-10-2022:27.6
  • 23-09-2022至29-09-2022:33.1

最终期望结果:

ABDateRates
xa03-10-202227.6
yb02-10-202227.6
zc01-10-202227.6
td30-09-202227.6
ke29-09-202233.1
hf28-09-202233.1
ug27-09-202233.1

实现步骤

1. 导入依赖并构造DataFrame

import pandas as pd
import numpy as np

# 构造df1
df1 = pd.DataFrame({
    'A': ['x', 'y', 'z', 't', 'k', 'h', 'u'],
    'B': ['a', 'b', 'c', 'd', 'e', 'f', 'g'],
    'Date': ['03-10-2022', '02-10-2022', '01-10-2022', '30-09-2022', '29-09-2022', '28-09-2022', '27-09-2022']
})

# 构造df2
df2 = pd.DataFrame({
    'unnamed': ['x', 'y', 'rates', 'z'],
    '14-10-2022': ['a', 'b', 30.2, 'c'],
    '07-10-2022': ['aa', 'bb', 24.8, 'cc'],
    '30-09-2022': ['aaa', 'bbb', 27.6, 'ccc'],
    '23-09-2022': ['aaaa', 'bbbb', 33.1, 'cccc']
})

2. 转换日期格式为datetime类型

将df1的Date列和df2的日期列名统一转换为datetime类型,方便后续区间匹配:

# 转换df1的Date列
df1['Date'] = pd.to_datetime(df1['Date'], format='%d-%m-%Y')

# 提取df2中的rates行,并转换列名为datetime
rates_row = df2[df2['unnamed'] == 'rates'].iloc[0, 1:]
rates_row.index = pd.to_datetime(rates_row.index, format='%d-%m-%Y')
# 按日期降序排序,确保区间顺序正确
rates_row = rates_row.sort_index(ascending=False)

3. 按日期区间匹配Rates值

使用numpy.select根据日期区间匹配对应的rates值:

# 获取排序后的日期和对应rates值
date_points = rates_row.index.tolist()
rate_values = rates_row.values.tolist()

# 定义日期区间条件
conditions = [
    df1['Date'] > date_points[0],  # 大于14-10-2022
    (df1['Date'] <= date_points[0]) & (df1['Date'] > date_points[1]),  # 07-10至14-10之间
    (df1['Date'] <= date_points[1]) & (df1['Date'] >= date_points[2]),  # 30-09至07-10之间
    (df1['Date'] < date_points[2]) & (df1['Date'] >= date_points[3])  # 23-09至30-09之间
]

# 对应区间的rates值
values = rate_values

# 添加Rates列到df1
df1['Rates'] = np.select(conditions, values)

4. 查看结果

执行上述代码后,df1将生成期望的Rates列,打印结果:

print(df1)

输出结果与期望一致:

A  B       Date  Rates
0  x  a 2022-10-03   27.6
1  y  b 2022-10-02   27.6
2  z  c 2022-10-01   27.6
3  t  d 2022-09-30   27.6
4  k  e 2022-09-29   33.1
5  h  f 2022-09-28   33.1
6  u  g 2022-09-27   33.1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:01:14