按数据框中的日期过滤数据

时间:2016-04-12 12:16:14

标签: python csv python-3.x pandas

下面有一些代码将一些时间序列csv文件导入到数据框中,并将数据框的列名更改为具有时间日期的列的“日期”,其他列设置为文件名他们来自。到目前为止都很好。现在我想读入两个预设日期之间的数据。这是我遇到问题的地方。我无法让代码只将数据帧从startDate返回到endDate并删除其他数据行。

我已经做了各种各样的事情,但我无法让过滤器工作。请看下面我代码的当前版本:

def getTimeseriesData4(DataPath,columnNum,startDate,endDate):
    colNames = ['date']

    path = DataPath
    filePath = path, "*.csv"
    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)

    dataframes = [pd.read_csv(fname, header=None,usecols=[0,columnNum]) for fname in allfiles]



    #this is the part where I am trying to filter out the data I do not need.  So dataframes would only have data between the startDate and the endDate
    dataframes = dataframes.set_index(['date'])
    print(dataframes.loc[startDate:endDate])



    timeseriesData = reduce(partial(pd.merge, on=0, how='outer'), dataframes)
    timeseriesData.columns=colNames

    return timeseriesData  
下面的

是我要导入的数据的示例

          date  BBG.BBG.AUDEUR.FX  BBG.BBG.CADEUR.FX  BBG.BBG.CHFEUR.FX  \
0   01/01/2001             0.5932             0.7084             0.6588   
1   02/01/2001             0.5893             0.7038             0.6576   
2   03/01/2001             0.6000             0.7199             0.6610   
3   04/01/2001             0.5972             0.7021             0.6563   
4   05/01/2001             0.5973             0.6972             0.6532   
5   08/01/2001             0.5987             0.7073             0.6562   
6   09/01/2001             0.5972             0.7095             0.6565   
7   10/01/2001             0.5923             0.7105             0.6548   
8   11/01/2001             0.5888             0.7029             0.6512   
9   12/01/2001             0.5861             0.7013             0.6494   
10  15/01/2001             0.5870             0.7064             0.6492   
11  16/01/2001             0.5892             0.7047             0.6497   
12  17/01/2001             0.5912             0.7070             0.6507   
13  18/01/2001             0.5920             0.7015             0.6544   
14  19/01/2001             0.5953             0.7083             0.6535 

所以如果我将startDate设置为'02 / 01/2001'并将endDate设置为'05 / 01/2001'

代码会返回:

          date  BBG.BBG.AUDEUR.FX  BBG.BBG.CADEUR.FX  BBG.BBG.CHFEUR.FX  \
0   02/01/2001             0.5893             0.7038             0.6576   
1   03/01/2001             0.6000             0.7199             0.6610   
2   04/01/2001             0.5972             0.7021             0.6563   
3   05/01/2001             0.5973             0.6972             0.6532 

因此代码不会返回从CSV文件导入的所有数据,而是返回startDate和endDate之间的数据。我希望我能够充分解释自己,并且非常感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:3)

使用dtype

datetime转换为pd.to_datetime
In [98]:
df['date'] = pd.to_datetime(df['date'])
df.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 15 entries, 0 to 14
Data columns (total 4 columns):
date                 15 non-null datetime64[ns]
BBG.BBG.AUDEUR.FX    15 non-null float64
BBG.BBG.CADEUR.FX    15 non-null float64
BBG.BBG.CHFEUR.FX    15 non-null float64
dtypes: datetime64[ns](1), float64(3)
memory usage: 600.0 bytes

然后,您可以将日期作为过滤条件传递,以创建布尔掩码:

In [97]:
df[(df['date'] >= '02/01/2001') & (df['date'] <= '05/01/2001')]

Out[97]:
        date  BBG.BBG.AUDEUR.FX  BBG.BBG.CADEUR.FX  BBG.BBG.CHFEUR.FX
1 2001-02-01             0.5893             0.7038             0.6576
2 2001-03-01             0.6000             0.7199             0.6610
3 2001-04-01             0.5972             0.7021             0.6563
4 2001-05-01             0.5973             0.6972             0.6532