使用文件名作为指标来使用 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)
我正在将 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)