首页 > 解决方案 > 如何在不打开 csv 文件的情况下添加新列

问题描述

我报废了数据并导出为 csv 文件。为简单起见,数据如下所示(我故意放置任意变量只是为了举例说明):

id var1 var2 var3 ...
A  10   14    355 ...
B  35   56    22  ...
C  95   22    222 ...
D  44   55    222 ... 

由于我每天都收集数据,所以我将文件名保存为 city_20180814_result.csv 例如,如果我在 2018 年 8 月 14 日在 NYC 收集数据,则对应的文件名为 NYC_20180814_result.csv

在这里,我想在每个 csv 文件中添加一个新列,即日期变量。所需的示例将类似于下面的示例。具体来说,我想为每个 csv 文件添加一个日期(YYYYMMDD 作为格式)列,这些值将是收集数据的日期。例如,下面的示例 csv 文件是在 2018 年 8 月 14 日生成的,那么更新后的数据将如下所示:

id   date     var1 var2  var3 ...
A    20180814 10   14    355 ...
B    20180814 35   56    22  ...
C    20180814 95   22    222 ...
D    20180814 44   55    222 ... 

执行此操作的常规方法是打开每个 csv 文件并手动添加新列,为所有行分配相应的日期,然后对所有 csv 文件重复此步骤。但是有太多人无法完成这项工作。有没有办法有效地做到这一点?由于我保存了包括日期在内的文件名,因此如果可能的话,最好使用它。任何帮助/代码(通过再次使用 python 或 excel 宏)将不胜感激。

标签: pythonexcelvbacsv

解决方案


我使用pythonpandas包的解决方案:

import os
import re
import pandas as pd

FILE_PATTERN = re.compile(r'(.*)_(\d{8})_result.csv')

def addDate(file_dir):
    csv_list = [csvfile for csvfile in os.listdir(file_dir) if re.fullmatch(FILE_PATTERN, csvfile)]
    for csvname in csv_list:
        date = re.fullmatch(FILE_PATTERN, csvname).group(2)
        df = pd.read_csv(os.path.join(file_dir, csvname))
        df.insert(loc=1, column='date', value=[date]*len(df))
        df.to_csv(os.path.join(file_dir, csvname), index=False)

样本输入:NYC_20180814_result.csvsome_path

   A  B  C
0  0  1  2
1  3  4  5
2  6  7  8

执行后相同的csv addDate(some_path)

   A      date  B  C
0  0  20180814  1  2
1  3  20180814  4  5
2  6  20180814  7  8

PS 您不会在 csv 文件中看到索引列。


推荐阅读