使用文件名作为指标来使用 pandas 处理日期时间列

Use filename as an indicator to process datetime columns using pandas

我正在将 15 个 csv 文件读入 pandas 数据框。我在最终数据框中想要的列分布在多个 csv 文件中

文件 1 到文件 8 的文件名模式 - Med*(例如:Med1、Med2、Medtest、Medkill)

文件 1 到文件 8 的示例数据如下所示

df = pd.DataFrame({'person_id': [101,101,101,101,202,202,202],
                   'start_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM'],'type':['O','I','O','O','I','O','I']})

文件 9 到文件 12 的文件名模式 - Adm*(例如:Adm1、Adm2、Admaasd、Admmed)

从文件 9 到文件 12 的示例数据如下所示

df = pd.DataFrame({'person_id': [101,101,101,101,202,202,202],
                        'start_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM'],
                        'end_date':['5/12/2013 09:27:00 AM',np.nan,'06/11/2014 08:00:00 AM',np.nan,'12/16/2011 10:00:00','10/18/2012 00:00:00',np.nan],
                        'type':['O','I','O','O','I','O','I']})

文件 13 到文件 15 的文件名模式 - cas*(例如:castest、caste22、caskill)

文件 13 到文件 15 的示例数据如下所示

df = pd.DataFrame({'person_id': [101,101,101],
                   'start_date':['5/2/2013 09:27:00 AM','09/03/2013 11:21:00 AM','06/01/2014 08:00:00 AM'],'dur':['3w','3m','2d']})

在我的最终数据框中,我希望列名如下所示

person_ID, start_date, end_date

如您在 file 1 to 8 中所见,没有 end_date 列。因为end_date = start_date。所以我们必须将 start_date 值复制到 end_date

file 13 to 15 类似,我们也没有 end_date 列。但是我们可以通过将 duration 列值添加到 start_date.

来得出 end_date

我尝试了以下

pat_dir = ['Med*.csv','C:\test\Adm*.csv', 'C:\test12\test13\cas*.csv']
files_grabbed = [] 
cols = ['person_id','start_date','end_date']
dfs = [pd.read_csv(f, sep=",",low_memory=False).reindex(columns=cols) 
       for f in files_grabbed]

虽然上面的代码在最终数据框中使用 NA 创建了 end_date 列(对于原始文件中没有此列的文件)。

问题是我如何识别具有模式的文件需要不同的处理方式end_dates

Med* - 将 start_date 值复制为 end_date

cas* - 将持续时间添加到 start_date 并将它们存储在 end_date 列中

通过我的代码,我创建了一个最终数据框,但不知道如何将 end_date 逻辑应用于这些文件?

是否可以在创建最终数据帧之前或在读取操作期间添加这些逻辑?

使用if语句按文件名进行测试:

import os

#custom function for add values by duration
def func(x):

    if pd.isna(x['dur']):
        return x['start_date']

    elif x[1] == 'w':
        return x['start_date'] + pd.offsets.DateOffset(weeks=x[0])
    elif x[1] == 'm':
        return x['start_date'] + pd.offsets.DateOffset(months=x[0])
    elif x[1] == 'd':
        return x['start_date'] + pd.offsets.DateOffset(days=x[0])
    else:
        return x['start_date']

dfs = []
for f in files_grabbed:
    df = pd.read_csv(f, sep=",",low_memory=False)
    name = os.path.basename(f)
    if name.startswith('Med'):
        dfs.append(df.assign(end_date = df['start_date']))

    elif name.startswith('cas'):

        df['start_date'] = pd.to_datetime(df['start_date'])
        df[[0,1]] = df['dur'].str.extract('(\d+)(\D+)')
        df[0] = df[0].fillna(0).astype(int)
     
        df['end_date'] = df.apply(func, axis=1)
        dfs.append(df)
    else:
        dfs.append(df)