使用文件名作为指示器,使用panda处理日期时间列



我正在将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、barkill(

从文件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*-将开始日期值复制为结束日期

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)

最新更新