【问题标题】:Create date index while importing multiple csv from file names从文件名导入多个 csv 时创建日期索引
【发布时间】:2019-02-10 16:21:02
【问题描述】:

我在一个文件夹中有 250 个 csv 文件,我使用以下代码将它们导入单个数据框:

files = "~/*.csv"
df = pd.concat([pd.read_csv(f, dtype='str') for f in glob.glob(files)], ignore_index=True)

我的问题是我在任何文件中都没有日期信息,日期在文件名中提到,例如“LSH_190207”,即7-Feb-2019。 有没有办法在导入文件时将此信息包含在数据框中,最好是作为索引。 或者至少创建一个包含文件名的新列,以便我以后可以将其拆分并格式化为日期列。

【问题讨论】:

    标签: pandas dataframe


    【解决方案1】:

    是的,你可以,

    假设文件列表是

    files = glob.glob('*.csv')
    #['file1_LSH_190207_something.csv', 'file2_LSH_190208_something.csv']
    #[f.split("_")[2] for f in files] gives ['190207', '190208']
    

    这将创建一个日期列,其中日期的值为字符串:

    df= pd.concat([pd.read_csv(f, dtype='str').assign(date= f.split("_")[2]) for f in files],\
                                                                      ignore_index=True)
    

    样本输出:

       A  B  C    date
    0  1  2  3  190207
    1  4  5  6  190207
    2  5  6  8  190208
    3  9  1  3  190208
    

    发布此消息后,您可以执行以下操作以将日期转换为您自己的格式:

    pd.to_datetime(df['date']).dt.strftime('%d-%b-%Y')
    
    0    07-Feb-2019
    1    08-Feb-2019
    2    09-Feb-2019
    

    【讨论】:

    • 导入成功,但我的文件名在日期信息后以 .CSV 结尾,所以我使用 df.date = df.date.str.replace('.csv', '')保留数字。日期转换不起作用,我用了 df.date = pd.to_datetime(df.date, format='%y%m%d')
    • 请给我一个示例日期,如果190207 只需使用 pd.to_datetime()
    【解决方案2】:

    在 lins 理解中创建 Datetimeindex 并将其传递给 concat 中的参数 keys,只需要通过 reset_index 删除第二级 MultiIndex

    idx = pd.to_datetime([f.split("_")[2] for f in files])
    print (idx)
    
    df = pd.concat([pd.read_csv(f, dtype='str') for f in files], 
                    keys = idx).reset_index(level=1, drop=True)
    

    【讨论】:

      猜你喜欢
      • 2018-02-12
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 2017-05-01
      • 2017-08-13
      • 2013-03-13
      • 1970-01-01
      • 2023-02-18
      相关资源
      最近更新 更多