大Pandas在离上一个迪吉最近的一年出生

2024-04-25 19:54:19 发布

您现在位置: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年结束的最接近年份)

有没有一种方法可以使用datetime功能自动执行此操作


Tags: date交易assetyearclassrowlastdigit
1条回答
网友
1楼 · 发布于 2024-04-25 19:54:19

首先,创建包含月份、年份以及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]

相关问题 更多 >