【问题标题】:Looping through csv files to create concatenated dataframe. Need to use date in file name to create new column for each file循环遍历 csv 文件以创建连接的数据帧。需要在文件名中使用日期为每个文件创建新列
【发布时间】:2021-06-28 13:16:11
【问题描述】:

我有一些看起来像这样的代码:

import pandas as pd
import glob

root_directory = r"\\some\shared\directory"

all_files = glob.glob(f'{root_directory}\CPE_*.csv')

li = []

for filename in all_files:
    frame = pd.read_csv(filename, index_col=None, header=0, encoding='latin1')
    li.append(frame)

df = pd.concat(li, axis=0, ignore_index=True)

此代码允许我连接数据并创建一个主 csv 文件,但我想在循环遍历它们时为每个数据框添加一个新列。文件名如下所示: CPE_02082020.csv 、 CPE_02092020 等。因此日期在文件名本身中,格式为 mmddyyyy。如何在循环和连接每个文件时为每个文件添加日期列?

【问题讨论】:

  • 每个新文件只会添加一列?文件的行数是否相等?
  • 不是所有文件的行数都不相同。只是想在这个主数据框中添加 1 个“日期”列。

标签: python-3.x pandas loops date glob


【解决方案1】:

您可以在 for 循环期间分配列,让我们使用列表理解和Pathlib 进行一些简化:

import pandas as pd 
from pathlib import Path 

root_dir = Path('\\some\shared\directory')

all_files = root_dir.glob('*CPE_*.csv')

dfs = [
    pd.read_csv(f, index_col=None, header=0, encoding='latin1')\
            .assign(date_col=
                pd.to_datetime(f.stem.split('_')[1],format='%m%d%Y',errors='coerce'))
    for f in all_files
]


print(pd.concat(dfs))

【讨论】:

    【解决方案2】:

    要为每个数据框添加一个日期列,您只需在遍历 all_files 时向框架添加一个新列。此方法由biobirdman on a previous post 提出。然后,您可以使用 split() 从文件名中获取日期。

    试试:

    for filename in all_files:
        frame = pd.read_csv(filename, index_col=None, header=0, encoding='latin1')
        frame['date'] = filename.split('_')[1]
        li.append(frame)
    
    df = pd.concat(li, axis=0, ignore_index=True)
    

    然后将 df['date'] 转换为日期时间添加:

    df['date'] = pd.to_datetime(df['date'])
    

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 2023-03-05
      • 2016-10-25
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多