如何基于日期范围条件从另一DataFrame填充数据?
解决方案
可以通过以下步骤实现基于指定日期范围提取数据并生成目标DataFrame:
- 数据类型转换:将df1的起止日期列和df2的DATE列转换为
datetime类型,确保日期比较的准确性。 - 构建日期掩码:为每个公司生成一个布尔掩码,标记df2中符合该公司日期范围的行。
- 应用掩码过滤数据:对df2的每个公司列应用对应掩码,将超出范围的值替换为
NaN。
完整代码实现
import pandas as pd # 定义df1(日期范围条件) df1 = pd.DataFrame({ 'company': ['a', 'b', 'c', 'd'], 'start date': ['2023-01-02', '2023-01-05', '2023-01-04', '2023-01-03'], 'end date': ['2023-01-06', '2023-01-12', '2023-01-13', '2023-01-10'] }) # 定义df2(数据源) df2 = pd.DataFrame({ 'DATE': ['2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13'], 'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'b': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 'c': [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], 'd': [40, 41, 42, 43, 44, 45, 46, 47, 48, 49] }) # 转换日期列类型为datetime df1['start date'] = pd.to_datetime(df1['start date']) df1['end date'] = pd.to_datetime(df1['end date']) df2['DATE'] = pd.to_datetime(df2['DATE']) # 创建目标DataFrame df3,初始复制df2 df3 = df2.copy() # 遍历每个公司,应用日期范围过滤 for _, row in df1.iterrows(): company = row['company'] start = row['start date'] end = row['end date'] # 生成掩码:DATE在[start, end]范围内的行保留,否则设为NaN mask = (df2['DATE'] >= start) & (df2['DATE'] <= end) df3[company] = df3[company].where(mask, other=pd.NA) # 查看结果 print(df3)
输出结果
DATE a b c d 0 2023-01-02 1.0 <NA> <NA> <NA> 1 2023-01-03 2.0 <NA> <NA> 41.0 2 2023-01-04 3.0 <NA> 32.0 42.0 3 2023-01-05 4.0 13.0 33.0 43.0 4 2023-01-06 5.0 14.0 34.0 44.0 5 2023-01-09 <NA> 15.0 35.0 45.0 6 2023-01-10 <NA> 16.0 36.0 46.0 7 2023-01-11 <NA> 17.0 37.0 <NA> 8 2023-01-12 <NA> 18.0 38.0 <NA> 9 2023-01-13 <NA> <NA> 39.0 <NA>
注:输出中的<NA>与NaN在pandas中功能等价,若需要统一显示为NaN,可在最后添加df3 = df3.fillna(pd.NA).replace({pd.NA: np.nan}),需提前导入numpy。
内容的提问来源于stack exchange,提问作者stvlam22
相关产品推荐
相关产品推荐

