楼主: 疏朗612
11502 8

[问答] 请问R语言里如何计算当前日期往前所在的半年的天数? [推广有奖]

  • 1关注
  • 0粉丝

高中生

57%

还不是VIP/贵宾

-

威望
0
论坛币
18 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1499 点
帖子
18
精华
0
在线时间
35 小时
注册时间
2015-3-23
最后登录
2016-2-25

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
具体是这样的,要求债券的付息天数,比如到期日2021-07-31,交易日为2014-01-02,付息频率是半年一次。
现在我要计算:
1.交易日距离上次付息日的天数,也就是2013-07-31到2014-01-02的天数,(是155)
2.交易日所在的半年的总天数,也就是2013-07-31到2014-01-31的天数。(是184)

以上是一个具体的日期,容易推算,但是有很多不同日期的情况下如何写一个程序具体运算?
主要是会有一些不好处理的情况,比如到期日是2021-08-31,那么上次付息日期就是2013年2月的最后一天,但还需要考虑是否是闰年,2月有多少天的问题。有没有自动实现的方法? 或者R中是否有金融方面的函数可以直接计算?

求各位大神解答困惑,不胜感激,初来乍到,期望与大家一同进步!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言 不胜感激 初来乍到 交易日 如何写 如何

沙发
疏朗612 发表于 2015-7-6 15:25:12 |只看作者 |坛友微信交流群
求解答~感觉R里应该有直接能解决的package,可是找不到……

使用道具

藤椅
疏朗612 发表于 2015-7-7 15:40:34 |只看作者 |坛友微信交流群
顶一下,求解答

使用道具

板凳
疏朗612 发表于 2015-7-8 09:29:39 |只看作者 |坛友微信交流群
R里的日期处理我觉得比较棘手,还是求各位高手指明道路~感谢!

使用道具

报纸
crystalyang1210 学生认证  发表于 2015-7-8 23:39:57 |只看作者 |坛友微信交流群
不是很理解你要求付息天数,为什么要求半年的天数。 但如果简化为求两个日期间的天数就很简单了。
比如 a data set (date) has two columns: start             end   
                                                       2014-01-02   2014-07-31
                                                       2014-07-31   2015-01-02
date$date_diff <- as.Date(as.character(data$end), format="%Y/%m/%d")-
                  as.Date(as.character(data$start), format="%Y/%m/%d")
date
       start       end              date_diff
1.2014-01-02   2014-07-31   210 days
2.2014-07-31   2015-01-02   155 days

不用考虑闰年的问题。。。

小白学习中。。。如有考虑不周全的地方,各大神请轻拍
已有 1 人评分论坛币 收起 理由
admin_kefu + 25 热心帮助其他会员

总评分: 论坛币 + 25   查看全部评分

使用道具

地板
疏朗612 发表于 2015-7-9 10:34:35 |只看作者 |坛友微信交流群
crystalyang1210 发表于 2015-7-8 23:39
不是很理解你要求付息天数,为什么要求半年的天数。 但如果简化为求两个日期间的天数就很简单了。
比如 a  ...
谢谢回答! 不过我的具体问题是这样的,可能是我没有表述清楚,所以我把原始数据粘贴过来:

债券代码_BdCd        债券名称_BdNm        债券面值(元)_Par        票面利率_CoupRt        年付息频率_Freq        到期日_MatDt        交易日期_TrdDt        净价收盘价(元)_ClNetPr        全价收盘价(元)_ClDirPr
010504        05国债(4)        100        4.11        2        2025-05-15        2005-05-23        100        100.1
010504        05国债(4)        100        4.11        2        2025-05-15        2005-05-25        101.15        101.27
010504        05国债(4)        100        4.11        2        2025-05-15        2005-05-26        101.63        101.77
010504        05国债(4)        100        4.11        2        2025-05-15        2005-05-27        101.8        101.95
010504        05国债(4)        100        4.11        2        2025-05-15        2005-05-30        101.13        101.31
010504        05国债(4)        100        4.11        2        2025-05-15        2005-05-31        101.34        101.53
010504        05国债(4)        100        4.11        2        2025-05-15        2005-06-01        101.76        101.96
010504        05国债(4)        100        4.11        2        2025-05-15        2005-06-02        101.8        102.01

就是很多行这样的数据,以第一行为例,到期日为2025-05-15,交易日期为2005-05-23,付息频率是半年一次,所以上次付息时间是2005-05-15,我的问题是如何在R中获得“2005-15-05”这个日期。
而本次付息时间则是要求一个半年的天数,比如第一行就是要求“2005-05-15”到“2005-11-15”的天数,同样问题是如何获得这两个日期……如果能获得的话,我知道可以用difftime等函数直接求日期之间的天数的。
您可以再看看我的问题,很感谢您的回答!

使用道具

7
crystalyang1210 学生认证  发表于 2015-7-9 22:26:25 |只看作者 |坛友微信交流群
不懂为什么要从半年天数求付息日期,这样不就要考虑闰年的问题了么。。。

今天有点忙,就不仔细写了。 分两步吧。
第一步, 判定"交易日期_TrdDt"归前半年后半年
if month&day<5/15 { 付息日期=“交易日期_TrdDt的%year-1”+11/15}
else if  (5/15<- month&day<11/15) {付息日期=“交易日期_TrdDt的%year”+5/15}
else{ 付息日期=“交易日期_TrdDt的%year”+11/15}

第二步,生成新的一列付息日期后计算每半年的付息日期
> seq(as.Date('2005-05-15'),to=as.Date('2025-05-15'),by='6 months')
[1] "2005-05-15" "2005-11-15" "2006-05-15" "2006-11-15" "2007-05-15" "2007-11-15" "2008-05-15" "2008-11-15" "2009-05-15" "2009-11-15" "2010-05-15"
[12] "2010-11-15" "2011-05-15" "2011-11-15" "2012-05-15" "2012-11-15" "2013-05-15" "2013-11-15" "2014-05-15" "2014-11-15" "2015-05-15" "2015-11-15"
[23] "2016-05-15" "2016-11-15" "2017-05-15" "2017-11-15" "2018-05-15" "2018-11-15" "2019-05-15" "2019-11-15" "2020-05-15" "2020-11-15" "2021-05-15"
[34] "2021-11-15" "2022-05-15" "2022-11-15" "2023-05-15" "2023-11-15" "2024-05-15" "2024-11-15" "2025-05-15"

So......        seq(as.Date(Data$TrdDt), to=as.Date(Data$MatDt),by='6 months')

最后做个loop 就可以一起run了

用lubridate package可以抓年日月
> require(lubridate)
> month(date1)
[1] 5
> year(date1)
[1] 2015

这个问题还蛮好玩的~逻辑有不严密的地方,你自己补充哈~

使用道具

8
crystalyang1210 学生认证  发表于 2015-7-9 22:33:19 |只看作者 |坛友微信交流群
管理员好小气T_T

使用道具

9
bfdddp 发表于 2016-11-8 17:11:37 |只看作者 |坛友微信交流群
其实 time <- as.Date(“2016-1-10") time显示"2016-1-10",但是他的值就是距离unix元年的天数, time+180 的值就是 180天后的日期,不用考虑大小月和闰年。准确无误。

你要是想前后6个月,考虑实际月的大小,及 12月10号到 6月10号算半年,不关系它实际天数那么可以用这个小函数实现

function (date,mon=0,year=0)
{date <- as.character(date)
   
    date <- strsplit(date,"-")
    y<- sapply(date,"[",1)
    m <- sapply(date,"[",2)
    d <- sapply(date,"[",3)
    y <- as.numeric(y)
    m <- as.numeric(m)
    y <- y+year
    y <- y+mon%/%12
    m <- m+mon%%12
    if(m<1){m <- m+12;y <- y-1}
    if(m>12){m <- m-12;y <- y+1}
    y <- as.character(y)
    m <- as.character(m)
    date <- paste(y,m,d,sep="-")   
    date <- as.Date(date)
    return(date)
}

> jsmon("2016-01-10",mon=-2)
[1] "2015-11-10"
> jsmon("2016-01-10",mon=-2,year=1)
[1] "2016-11-10"
> jsmon("2016-01-10",mon=-30,year=1)
[1] "2014-07-10"
方便可靠 ,第一个参数要 as.Date("2016-1-23")

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-26 23:33