熊猫阅读CSV并根据归档过滤数据帧

时间:2016-07-07 10:27:06

标签: python date csv pandas

我试图将一堆CSV文件读入一个pandas数据帧。某些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都单独进行评估,但似乎无法实现。

1 个答案:

答案 0 :(得分: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:# modification date: 2016-07-05

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