python - 熊猫 - 从最后一位数字中生成下一个最接近的年份
问题描述
在计算某些金融工具的到期日时,通常我们需要做的只是以下几点:
Trade Date RIC
5/22/1989 SPH0
5/23/1989 SPH0
5/24/1989 SPH0
5/25/1989 SPH0
5/26/1989 SPH0
如果交易日期是交易工具的一天,RIC 是一个 4 个字母的字符串,由以下各项组成:
First 2 characters = an asset class
3rd character = expiration month
last character = last digit of expiration year
到期月份解释:
month_codes_to_int = {'F':'1', 'G':'2', 'H':'3', 'J':'4', 'K':'5', 'M':'6',
'N':'7', 'Q':'8', 'U':'9', 'V':'10', 'X':'11', 'Z':'12'}
我通过使用交易日期和 RIC 为每一行生成一个到期年份......我这样做是通过迭代 DF 并每次使用一个可以正确计算到期日期的函数填充一列中的一个空单元格来实现的。
for index, row in df.iterrows():
row['Trade Date'] = pd.to_datetime(row['Trade Date'])
print(row['Trade Date'], row['RIC'])
current_year = row['Trade Date'].year
asset_class = row['RIC'].split[0:3]
expiration_month = row['RIC'][2]
expiration_year_last_digit = row['RIC'][3]
expiration_year =
我的方法是让到期日期是最接近当前日期的月份和年份,因此例如 1989 年 5 月 22 日它将是 1990 年 3 月 15 日(日期无关紧要,1990 年是最接近的以 0 到 1989 结尾的年份)。
有没有办法使用熊猫日期时间功能自动执行此操作?
解决方案
首先,创建包含您的月份、年份以及TradeDate
列的最后一位数字的系列。
m = df.RIC.str[2].map(month_codes_to_int)
y = df.RIC.str[3].astype(int)
s = df.TradeDate.dt.year.mod(10)
然后计算你的偏移量:
offset = np.where(y==s, 0, 10+y-s)
最后,创建新列:
pd.to_datetime((df.TradeDate.dt.year + offset).astype(str) + m, format='%Y%m')
输出:
0 1990-03-01
1 1990-03-01
2 1990-03-01
3 1990-03-01
4 1990-03-01
dtype: datetime64[ns]
推荐阅读
- python - 获取正在运行的文件的路径,而不是调用来自的目录
- html - 将标签链接到 html / css 中的重点输入限制的问题
- postgresql - 无法在 Ubuntu 上安装 pgaudit
- mysql - MySQL游标不适用于日期变量
- python - Openpyxl 无法加载工作簿
- r - 在 R 中用 0 拟合 beta 分布
- keycloak - Keycloak accountDisableMessage 属性不起作用
- php - 未定义变量:posts(查看:/app/resources/views/bbs/index.blade.php)
- javascript - 当用户单击用户列时,在链接上添加弹出模式以打开
- email - 使用 Mail 和 AppleScript 转发选定电子邮件的问题