根据设定日期检索数据的有效方法,如果不起作用,请提前一天轮班

2024-10-02 10:27:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份截至15年(即1999年12月31日至2015年12月31日)的标准普尔500指数的csv文件。因此,dataframe有15列holdings。我正试图编写一个代码,将循环通过每一列持有,采取这些持有和收集价格数据在多个点(即当前,3个月从当前期间和6个月从当前期间)。当前期间始终是循环通过的特定列的标题(例如12/31/2014)。你知道吗

我正在使用数据阅读器与财务雅虎拉价格数据。我正在努力找到最有效的方法。一个挑战是,financeyahoo API需要一个日期作为交易日期(即不能是周末)。因此,我使用try/excepts来尝试这个日期,如果它不起作用,就返回一天。我这样做了4次,因为这应该足够到一个交易日。我想知道这是不是让它慢了很多。有没有更有效的方法?我还没有得到运行整个15年的代码,因为它需要半小时做一年,当我试图一夜之间崩溃。你知道吗

equities = (sample data is below)

prices = DataFrame()
for col in equities.columns[16:18]:
    temp = DataFrame(equities[col])
    temp.rename(columns={col:'ticker'},inplace=True)
    date = datetime.datetime.strptime(col,'%m/%d/%Y').strftime('%Y-%m-%d')
    temp = DataFrame(temp['ticker'].dropna())
    temp = DataFrame(temp['ticker'].map(lambda x :str(x)[:-3]))
    temp['calendardate'] = date
    datetemp = datetime.datetime.strptime(date, '%Y-%m-%d')
    splicestart = 0
    splicenum = None

现行价格

    try:
        datecur = datetemp
        tempprice = DataFrame(
            DataReader(temp['ticker'][splicestart:splicenum], 'yahoo', datecur, datecur)['Adj Close']).transpose()
        temp = temp.merge(DataFrame(tempprice[datecur]), how='outer', left_on=temp['ticker'], right_index=True)
        temp.rename(columns={datecur: 'current'}, inplace=True)
    except:
        try:
            datecur = datetime.datetime(datecur.year,datecur.month,datecur.day-1)
            tempprice = DataFrame(
                DataReader(temp['ticker'][splicestart:splicenum], 'yahoo', datecur, datecur)['Adj Close']).transpose()
            temp = temp.merge(DataFrame(tempprice[datecur]), how='outer', left_on=temp['ticker'], right_index=True)
            temp.rename(columns={datecur: 'current'}, inplace=True)

我在那个特定的时间段做了一些尝试/例外,然后晚了3个月重复(见下面的代码):

3个月价格

try:
        datecur = datetime.datetime(datetemp.year + 1, datetemp.month - 9, datetemp.day)
        tempprice = DataFrame(
            DataReader(temp['ticker'][splicestart:splicenum], 'yahoo', datecur, datecur)['Adj Close']).transpose()
        temp = temp.merge(DataFrame(tempprice[datecur]), how='outer', left_on=temp['ticker'], right_index=True)
        temp.rename(columns={datecur: '3month'}, inplace=True)
    except:
        try:
            datecur = datetime.datetime(datecur.year, datecur.month, datecur.day - 1)
            tempprice = DataFrame(
                DataReader(temp['ticker'][splicestart:splicenum], 'yahoo', datecur, datecur)['Adj Close']).transpose()
            temp = temp.merge(DataFrame(tempprice[datecur]), how='outer', left_on=temp['ticker'], right_index=True)
            temp.rename(columns={datecur: '3month'}, inplace=True)

同样,还有2次尝试/例外是在换班前1天完成的。你知道吗

非常感谢您的帮助!你知道吗

样本数据

12/31/2012,12/31/2013,12/31/2014,12/31/2015  
A UN,A UN,A UN,A UN  
AA UN,AA UN,AA UN,AA UN  
AAPL UW,AAPL UW,AAPL UW,AAL UW  
ABC UN,ABBV UN,ABBV UN,AAP UN  
ABT UN,ABC UN,ABC UN,AAPL UW  
ACN UN,ABT UN,ABT UN,ABBV UN  
ADBE UW,ACN UN,ACN UN,ABC UN  
ADI UW,ADBE UW,ADBE UW,ABT UN  
ADM UN,ADI UW,ADI UW,ACN UN  
ADP UW,ADM UN,ADM UN,ADBE UW  
ADSK UW,ADP UW,ADP UW,ADI UW  
ADT UN,ADS UN,ADS UN,ADM UN  
AEE UN,ADSK UW,ADSK UW,ADP UW  
AEP UN,ADT UN,ADT UN,ADS UN  
AES UN,AEE UN,AEE UN,ADSK UW  
AET UN,AEP UN,AEP UN,ADT UN  
AFL UN,AES UN,AES UN,AEE UN  
AGN UN,AET UN,AET UN,AEP UN  
AIG UN,AFL UN,AFL UN,AES UN

Tags: columnstruedataframedatetimetempuwunticker
1条回答
网友
1楼 · 发布于 2024-10-02 10:27:08

熊猫有工作日指数(不包括周末) http://pandas.pydata.org/pandas-docs/stable/timeseries.html

pd.bdate_range(start, end)

您可以生成如下示例所示的工作日:

In [44]: start = datetime(2011, 1, 1)

In [45]: end = datetime(2012, 1, 1)

In [48]: rng = pd.bdate_range(start, end)

In [49]: rng
Out[49]: 
DatetimeIndex(['2011-01-03', '2011-01-04', '2011-01-05', '2011-01-06',
               '2011-01-07', '2011-01-10', '2011-01-11', '2011-01-12',
               '2011-01-13', '2011-01-14',
               ...
               '2011-12-19', '2011-12-20', '2011-12-21', '2011-12-22',
               '2011-12-23', '2011-12-26', '2011-12-27', '2011-12-28',
               '2011-12-29', '2011-12-30'],
              dtype='datetime64[ns]', length=260, freq='B')

相关问题 更多 >

    热门问题