如何将DataFrame的日期列与到期日行转为datetime类型?
解决方案
1. 转换Date列与到期日行至datetime类型
根据你的DataFrame结构(首行是债券名称,最左列是Date,索引0行为到期日),可以按以下步骤同时转换两类日期:
处理到期日行(索引0行)
提取到期日所在行(排除Date列,因为该列首行是"Maturity Date"字符串),将其转换为datetime类型:
import pandas as pd # 提取到期日数据并转换为datetime maturity_dates = test.iloc[0, 1:].apply(pd.to_datetime)
处理Date列
将Date列中除首行外的实际日期转换为datetime类型,同时保留首行的"Maturity Date"标识:
# 转换Date列的实际日期(跳过首行) test.loc[1:, 'Date'] = pd.to_datetime(test.loc[1:, 'Date']) # 若直接转换整列导致首行变成NaT,可手动恢复标识 # test.loc[0, 'Date'] = "Maturity Date"
2. 计算债券存续期
利用转换后的到期日与Date列日期相减,得到各日期下的债券剩余存续时间(结果为Timedelta类型,可按需转换为天数/月数):
方法1:新增列存储存续期
遍历每个债券列,计算并新增对应存续期列:
for bond_col in test.columns[1:]: # 计算存续期:到期日 - 当前日期 test.loc[1:, f'{bond_col}_remaining'] = maturity_dates[bond_col] - test.loc[1:, 'Date']
方法2:批量生成存续期DataFrame
通过广播运算批量计算,效率更高(适合数据量较大的场景):
# 提取有效日期序列 date_series = test.loc[1:, 'Date'].reset_index(drop=True) # 广播计算所有债券的存续期 remaining_periods = maturity_dates - date_series[:, None] # 转换为DataFrame并添加到原表 remaining_df = pd.DataFrame( remaining_periods.values, columns=[f'{col}_remaining' for col in maturity_dates.index], index=test.loc[1:].index ) test = pd.concat([test, remaining_df], axis=1)
补充说明
- 如果到期日行包含无效日期字符串,可在
pd.to_datetime中添加errors='coerce'参数,将无效值转为NaT,避免报错。 - 若需要将存续期转换为天数,可对结果调用
.dt.days属性,例如test[f'{bond_col}_remaining'].dt.days。
内容的提问来源于stack exchange,提问作者Jannjann
相关产品推荐
相关产品推荐

