计算直到年底的时间python

时间:2015-05-31 04:38:48

标签: python datetime pandas

我有过去50年每个工作日的股票价格数据,包括日期/时间戳。在每个月末,我需要计算直到年底的剩余天数。必须考虑闰年,因为解决方案必须使用时间戳。我试过这段代码:

from datetime import datetime 
t = df.index
dfa =(datetime(t.year, 12, 31) -t)/(datetime(t.year, 12, 31)-datetime(t.year, 1, 1))

但是,它返回TypeError:

  

只能将length-1数组转换为Python标量

我也试过这个:

i=0
df["time_value"] = 0
while i<len(df):
    t = df.index[i]
    time_value=(datetime(t.year, 12, 31) -t)/(datetime(t.year, 12, 31)-datetime(t.year, 1, 1))
    df.time_value[i] = time_value
    i+1

这是所用数据框的简短示例:

              CLOSE_SPX    Close_iBoxx  A_Returns  B_Returns  A_Vola    B_Vola
2014-05-15    1870.85      234.3017    -0.009362   0.003412   0.170535  0.075468   
2014-05-16    1877.86      234.0216     0.003747  -0.001195   0.170153  0.075378
2014-05-19    1885.08      233.7717     0.003845  -0.001068   0.170059  0.075384   
2014-05-20    1872.83      234.2596    -0.006498   0.002087   0.170135  0.075410   
2014-05-21    1888.03      233.9101     0.008116  -0.001492   0.169560  0.075326   
2014-05-22    1892.49      233.5429     0.002362  -0.001570   0.169370  0.075341   
2014-05-23    1900.53      233.8605     0.004248   0.001360   0.168716  0.075333   
2014-05-27    1911.91      234.0368     0.005988   0.000754   0.168797  0.075294   
2014-05-28    1909.78      235.4454    -0.001114   0.006019   0.168805  0.075474   
2014-05-29    1920.03      235.1813     0.005367  -0.001122   0.168866  0.075451   
2014-05-30    1923.57      235.2161     0.001844   0.000148   0.168844  0.075430   
2014-06-02    1924.97      233.8868     0.000728  -0.005651   0.168528  0.075641   
2014-06-03    1924.24      232.9049    -0.000379  -0.004198   0.167852  0.075267

1 个答案:

答案 0 :(得分:2)

Pandas具有DateOffset功能,可简化此类计算。您可以使用YearEnd访问pd.datetools.YearEnd()偏移量。创建一个新列'd'以进行处理。对于此列中的每个值,添加YearEnd偏移量。然后从总和中减去原始日期,得出到年底的天数:

import pandas as pd
df['d'] = df.index 
df['days'] = df.apply(lambda i: i['d'] + pd.datetools.YearEnd() - i['d'], axis=1)

您不需要创建新的“天”。列,您只需覆盖列&#39; d&#39;如果你愿意的话。

print df['days']将产生:

2014-05-15   230 days
2014-05-16   229 days
2014-05-19   226 days
2014-05-20   225 days
2014-05-21   224 days
2014-05-22   223 days
2014-05-23   222 days
2014-05-27   218 days
2014-05-28   217 days
2014-05-29   216 days
2014-05-30   215 days
2014-06-02   212 days
2014-06-03   211 days

如果您的index不是DateTime格式,请在加载文件时使用pd.to_datetime转换或使用parse_dates=True