【发布时间】:2020-06-17 12:31:46
【问题描述】:
我正在处理多个文件中的大数据。这是一个更大问题的一部分,但为了简单起见,我将它分成几部分。
文件 1 存储在 df1 中,文件 2 存储在 df2 中。我有大约 12 个文件,每个文件有 300 万条记录。
df1 和 df2 都是相关的,但存储为单独的文件。
df1 = pd.DataFrame({'person_id': [1, 2, 3, 4, 5],
'date_birth': ['12/30/1961', '05/29/1967', '02/03/1957', '7/27/1959', '01/13/1971'],
'date_death': ['07/23/2017','05/29/2017','02/03/2015',np.nan,np.nan]})
df1['date_birth'] = pd.to_datetime(df1['date_birth'])
df1['date_death'] = pd.to_datetime(df1['date_death'])
df1['diff_birth_death'] = df1['date_death'] - df1['date_birth']
df1['diff_birth_death']=df1['diff_birth_death']/np.timedelta64(1,'D')
df2 = pd.DataFrame({'person_id': [1,1,1,2,3],
'visit_id':['A1','A2','A3','B1','B2'],
'diag_start': ['01/01/2012', '02/25/2017', '02/03/2015', '07/27/2016', '01/13/2011'],
'diag_end': ['05/03/2012','05/29/2017','03/03/2015','08/15/2016','02/13/2011']})
df2['diag_start'] = pd.to_datetime(df2['diag_start'])
df2['diag_end'] = pd.to_datetime(df2['diag_end'])
df2['diff_birth_diag_start'] = df2['diag_start'] - df1['date_birth']
df2['diff_birth_diag_end'] = df2['diag_end'] - df1['date_birth']
df2['diff_birth_diag_start']=df2['diff_birth_diag_start']/np.timedelta64(1,'D')
df2['diff_birth_diag_end']=df2['diff_birth_diag_end']/np.timedelta64(1,'D')
我想做的是
1) 随机化/移动 date 和 month 值,但保留 year 组件和 time difference between events(在出生和死亡之间,在出生和 diag_start 之间,在出生和 diag_end 之间)
2)如何找到满足上述条件的每个主题的日期偏移值(添加/减去/随机化的天数)
在下面的示例中,我手动添加了偏移量。
person_id 1 = -10 days (incorrect value. you will see below as to why it's incorrect)
person_id 2 = 10 days
person_id 3 = 100 days
person_id 4 = 20 days
person_id 5 = 125 days
我希望我的输出如下所示
df1 - 全部正确 - 日期和月份偏移(保留年份和间隔)
df2 - 选择的偏移量不正确,导致年份发生变化。虽然间隔保持year 值已更改。
【问题讨论】:
-
我不知道我是否理解了这个问题。你有一个日期时间,比如 2000-01-01,然后你想随机化月份和日期部分,这样 2000 不能改变,但其他部分可以,例如:2000-04-28。这是你想要的吗?
-
是的。你说的对。但是您还应该记住事件之间的
time interval。因为它是按时间顺序排列的 -
我已经给出了
time interval和date_birth作为对其他日期列的引用。如果你看到我的示例数据代码,你就会有一个想法 -
这是否意味着间隔必须是正数,还是必须严格相同?示例:如果开始是 2000-01-01,结束事件是 2000-12-31?有一些有效的选项:1)不能随机化,因为这样做并保持间隔相同会改变开始年份或结束年份 2)仍然可以随机化,只要结束事件在开始事件之后,间隔仍然是正数并且两个日期仍然可以是 2000... 3) 只有开始年份和间隔必须相同,例如结束年份可以更改为 2001。
-
@MiguelAngelo - 你在现场.. 是的
2000-01-01和2000-12-31是一个极端情况。我们可以坚持选项 1。我知道它可能不适用于像2000-01-01或2000-12-31这样的边缘情况,但它们发生的机会非常少。对于上面帖子中显示的非边缘情况,可以帮助我如何完成吗?
标签: python python-3.x pandas dataframe datetime