2015-05-31 49 views
4

我有過去50年每個工作日的股票價格數據,包括日期/時間戳。在每個月的月底,我需要計算直到年底的剩餘天數。由於解決方案必須使用時間戳,所以必須考慮閏年。我嘗試這樣做的代碼:計算時間直到年底python

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

然而,它返回類型錯誤:

only length-1 arrays can be converted to Python scalars

我也嘗試這樣的:

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

看看http://stackoverflow.com/questions/1580227/find-time-until-a-date-in-python。事實上,這很接近重複。 – Scott

+0

感謝您的建議,那麼您將如何做? –

+0

'CLOSE_SPX' a ['DatetimeIndex'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.html)? – MattDMo

回答

2

熊貓有一個DateOffset能力簡化了這種計算。您可以通過pd.datetools.YearEnd()訪問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) 

你並不需要創建一個新的「天」欄,你可以覆蓋列「d ' 如果你希望。

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 

如果indexDateTime格式,然後用pd.to_datetime轉換或使用parse_dates=True時加載文件。