2016-07-07 88 views
1

我試圖將一堆CSV文件讀入單個熊貓數據幀。一些CSV具有多個日期的數據。我只需要每個CSV中的日期等於每個文件修改日期的數據。熊貓讀取CSV文件並基於文件過濾數據幀

這裏是我當前的嘗試:

import os 
import datetime 
import pandas as pd 
from pandas import Series, DataFrame 
import glob as glob 

path =r'C:xxx' 
allFiles = glob.glob(path + "/*.csv") 
frame = pd.DataFrame() 
def modification_date(filename): 
    t = os.path.getmtime(filename) 
    return datetime.datetime.fromtimestamp(t).strftime('%Y-%m-%d') 

list_ = [] 
for file_ in allFiles: 
    df = pd.read_csv(file_,index_col=None, header=0) 
    df["DATE"] = pd.to_datetime(df["DATE"], format='%Y-%m-%d') 
    filedate = modification_date(allFiles) 
    df = df[(df["DATE"] == filedate)] 
    list_.append(df) 
frame = pd.concat(list_) 
frame.reset_index(inplace=True, drop=True) 

失敗的原因是循環這裏創建修改日期的列表(因爲文件夾包含多個CSV的),該函數modification_date無法處理。錯誤是:「TypeError:強制轉換爲Unicode:需要字符串或緩衝區,找到列表」

我試圖圍繞如何修改此項目,以便每個CSV都單獨進行評估,但似乎無法獲得太多。

+0

你爲什麼在'filedate = modification_date(allFiles)'而不是'filedate = modification_date(file_)'? –

+0

哈,這是問題所在。感謝一雙清新銳利的眼睛。 – 1Sepi21

回答

0

我會做這種方式:

import os 
import glob 
import pandas as pd 

fmask = 'C:/Temp/.data/aaa/*.csv' 

all_files = glob.glob(fmask) 

# returns file's modification date (the time part will be truncated) 
def get_mdate(filename): 
    return (pd.to_datetime(os.path.getmtime(filename), unit='s') 
       .replace(hour=0, minute=0, second=0, microsecond=0)) 

df = pd.concat([pd.read_csv(f, parse_dates=['DATE']) 
        .query('DATE == @get_mdate(@f)') 
       for f in all_files 
       ], 
       ignore_index=True) 

測試:

1.csv:# modification date: 2016-07-07

DATE,VAL 
2016-07-06,10 
2016-07-06,10 
2016-07-05,10 
2016-07-07,110 
2016-07-07,110 

2.csv:

DATE,VAL 
2016-07-06,1 
2016-07-06,1 
2016-07-05,1 
2016-07-07,11 
2016-07-07,11 

結果:

In [208]: %paste 
df = pd.concat([pd.read_csv(f, parse_dates=['DATE']) 
        .query('DATE == @get_mdate(@f)') 
       for f in all_files 
       ], 
       ignore_index=True) 
## -- End pasted text -- 

In [209]: df 
Out[209]: 
     DATE VAL 
0 2016-07-07 110 
1 2016-07-07 110 
2 2016-07-05 1