在两个日期之间返回数据

时间:2016-04-23 09:49:21

标签: python python-3.x pandas

我有一些代码可以解析许多.CVS文件,检索多个列的所有数据并将数据放在数据框(称为dfs)中。我现在试图返回dfs中仅在两个日期之间的所有数据字段。

我正在尝试使用命令:

return dfs[(dfs['date'] >= startDate) & (dfs['date'] <= endDate)] 

但收到以下错误:

KeyError: 'date'

有人能让我知道我做错了吗? 请参阅下面的代码:

def getTimeseriesData(path,column_num,startDate,endDate):
    colNames = ['date']
    dfs = []

    allfiles = glob.glob(os.path.join(path, "*.csv"))
    for fname in allfiles:

        name = os.path.splitext(fname)[0]
        name = os.path.split(name)[1]
        colNames.append(name)

        df = pd.read_csv(fname, header=None, usecols=[0, column_num,4,5], 
                        parse_dates=[0], dayfirst=True,
                        index_col=[0], names=['date', name+'_LAST',name+'_VOLUME',name+'_MKTCAP'])

        df = df.groupby(level=0).agg('mean')

        dfs.append(df)        

    dfs = pd.concat(dfs, axis=1)

    return dfs[(dfs['date'] >= startDate) & (dfs['date'] <= endDate)] #<<--I think this is the problem

dfs的负责人(我希望在两个日期之间(例如2001-01-03和2001-01-05之间)返回数据,如下所示:

            BBG.XLON.BTA.S_LAST  BBG.XLON.BTA.S_VOLUME  BBG.XLON.BTA.S_MKTCAP  \
date                                                                            
2001-01-02                  572               26605510               37494.60   
2001-01-03                  560               24715470               36708.00   
2001-01-04                  613               52781855               40182.15   
2001-01-05                  630               56600152               41296.50   
2001-01-08                  633               41014402               41493.15   

            BBG.XLON.VOD.S_LAST  BBG.XLON.VOD.S_VOLUME  BBG.XLON.VOD.S_MKTCAP  
date                                                                           
2001-01-02                  NaN                    NaN                    NaN  
2001-01-03               225.00              444328736            145216.0020  
2001-01-04               239.00              488568000            154251.6643  
2001-01-05               242.25              237936704            156349.2288  
2001-01-08               227.75              658059776            146990.8642 

3 个答案:

答案 0 :(得分:1)

此处date是索引的名称,而不是列名:

变化:

return dfs[(dfs['date'] >= startDate) & (dfs['date'] <= endDate)] 

成:

return dfs[(dfs.index >= startDate) & (dfs.index <= endDate)] 

答案 1 :(得分:1)

如果您的索引是单调递增的日期序列,那么您可以更简单地做到这一点:

显示所有行,但只显示前两列:

In [98]: df.iloc[:, [0,1]]
Out[98]:
            BBG.XLON.BTA.S_LAST  BBG.XLON.BTA.S_VOLUME
date
2001-01-02                  572               26605510
2001-01-03                  560               24715470
2001-01-04                  613               52781855
2001-01-05                  630               56600152
2001-01-08                  633               41014402

过滤行,显示前两列:

In [99]: df.loc['2001-01-03':'2001-01-05', df.columns[0,1]]
Out[99]:
            BBG.XLON.BTA.S_LAST  BBG.XLON.BTA.S_VOLUME
date
2001-01-03                  560               24715470
2001-01-04                  613               52781855
2001-01-05                  630               56600152

或在你的情况下:

return dfs.loc[startDate:endDate]

答案 2 :(得分:0)

在Python中,'&amp;'是按位“和”,and是逻辑“和”。

最好在这里使用list comprehension

return [df for df in dfs if df['date'] >= startDate and df['date'] <= endDate]

将遍历dfs列表,检查if条件中的每个元素,并返回包含满足这些条件的所有元素的新列表。