Python Pandas:动态获取最新日期列值,计算‘Bps away from 1Y Min’列
动态获取最新日期列计算DataFrame新列
原始数据
| 行业 | 4/1/2022 | 5/1/2022 | 6/1/2022 | 1Y Min |
|---|---|---|---|---|
| A | 10 | 05 | 12 | 05 |
| B | 18 | 20 | 09 | 09 |
| C | 02 | 09 | 12 | 02 |
需求
新增列Bps away from 1Y Min,计算逻辑为:最新日期列的值 - 1Y Min列的值,要求最新日期列能动态识别,当新增日期列时自动更新。
期望输出
| 行业 | 4/1/2022 | 5/1/2022 | 6/1/2022 | 1Y Min | Bps away from 1Y Min |
|---|---|---|---|---|---|
| A | 10 | 05 | 12 | 05 | 7 |
| B | 18 | 20 | 09 | 09 | 0 |
| C | 02 | 09 | 12 | 02 | 10 |
用户尝试的错误代码
def dt_helper(dt_string): try: return datetime.datetime.strptime(dt_string, '%m/%d/%Y').date() except: return datetime.date(1900,1,1) df['Bps away from 1Y Min'] = df[max(df.columns, key=dt_helper)] - df('1Y Min')
问题分析与修正代码
核心问题
原代码存在两个关键问题:
- 语法错误:访问DataFrame列必须使用方括号
[],而非圆括号(),正确写法为df['1Y Min']。 - (可选)非日期列可能潜在干扰最新日期的判断,更严谨的方式是先筛选出日期列再进行判断。
修正后的简洁代码
import datetime def dt_helper(dt_string): try: return datetime.datetime.strptime(dt_string, '%m/%d/%Y').date() except: # 非日期列返回极小日期,确保不会被选为最新列 return datetime.date(1900, 1, 1) # 获取最新日期列 latest_date_col = max(df.columns, key=dt_helper) # 计算新列 df['Bps away from 1Y Min'] = df[latest_date_col] - df['1Y Min']
更严谨的写法(推荐)
先筛选出所有符合日期格式的列,再从中定位最新日期列,彻底避免非日期列的干扰:
import datetime # 筛选所有符合日期格式的列 date_columns = [] for col in df.columns: try: datetime.datetime.strptime(col, '%m/%d/%Y').date() date_columns.append(col) except ValueError: pass # 获取最新日期列 latest_date_col = max(date_columns, key=lambda x: datetime.datetime.strptime(x, '%m/%d/%Y').date()) # 计算新列 df['Bps away from 1Y Min'] = df[latest_date_col] - df['1Y Min']
额外注意事项
如果仍出现选取最早日期的情况,需检查日期格式字符串是否与列名的日期格式完全匹配,比如若列名是dd/mm/yyyy格式,需将%m/%d/%Y改为%d/%m/%Y。
内容的提问来源于stack exchange,提问作者Saanchi
相关产品推荐
相关产品推荐

