Python 3.x 在python中,如何将日期列表转换为首次访问后的天数?
我有一个显示医院就诊日期和患者ID号的数据列表,数据最初是一个pandas数据框,我将其写入一个CSV文件,该文件现在看起来类似于:Python 3.x 在python中,如何将日期列表转换为首次访问后的天数?,python-3.x,pandas,numpy,Python 3.x,Pandas,Numpy,我有一个显示医院就诊日期和患者ID号的数据列表,数据最初是一个pandas数据框,我将其写入一个CSV文件,该文件现在看起来类似于: | Patient | Date | |---------|------------| | 2 | 17/08/2005 | | 2 | 07/03/2006 | | 2 | 27/08/2008 | | 2 | 22/09/2010 | | 2 | 20/09/2011 | |
| Patient | Date |
|---------|------------|
| 2 | 17/08/2005 |
| 2 | 07/03/2006 |
| 2 | 27/08/2008 |
| 2 | 22/09/2010 |
| 2 | 20/09/2011 |
| 2 | 01/10/2012 |
| 3 | 13/03/2006 |
| 3 | 12/09/2006 |
| 3 | 12/09/2007 |
| 4 | 18/08/2005 |
| 4 | 03/05/2006 |
| 4 | 25/11/2008 |
| 5 | 23/08/2005 |
| 5 | 09/03/2006 |
| 5 | 06/09/2006 |
我想更改日期列,以显示自患者首次就诊以来的天数,因此对于上述数据,输出将如下所示:
| Patient | Days |
|---------|------|
| 2 | 0 |
| 2 | 202 |
| 2 | 1106 |
| 2 | 1862 |
| 2 | 2225 |
| 2 | 2602 |
| 3 | 0 |
| 3 | 183 |
| 3 | 548 |
| 4 | 0 |
| 4 | 258 |
| 4 | 1195 |
| 5 | 0 |
| 5 | 198 |
| 5 | 379 |
使用NumPy/Pandas有没有简单的方法?n、 b.整个数据集的访问量约为100000次
最后,我有一个第三栏(在医院进行的测试),我想在一个图表上绘制5000名患者的(自上次就诊后的天数)与(测试结果),每个患者都有自己的线条
| Patient | Days | Test_result |
|---------|------|-------------|
| 2 | 0 | 28 |
| 2 | 202 | 28 |
| 2 | 1106 | 29 |
| 2 | 1862 | 28 |
| 2 | 2225 | 23 |
| 2 | 2602 | 24 |
| 3 | 0 | 25 |
| 3 | 183 | 28 |
| 3 | 548 | 28 |
| 4 | 0 | 24 |
| 4 | 258 | 20 |
| 4 | 1195 | 24 |
| 5 | 0 | 17 |
| 5 | 198 | 19 |
| 5 | 379 | 27 |
我认为你需要:
- 转换列
日期
- 按列
和患者
,如有必要日期
- 并获取差异,将
s替换为NaN
0
- 将
s按转换为天timedelta
绘图 我认为5000个病人太多了,所以不是很好的图表。但如果真的需要: 通过使用或通过和重塑形状:
如果获取错误: ValueError:索引包含重复的条目,无法重塑 需要
pivot\u表
或groupby
+聚合函数
+取消堆栈
,请检查
编辑: 感谢您提供替代解决方案:
df['Date'] = pd.to_datetime(df['Date'])
df = df.sort_values(['Patient','Date'])
df['Days'] = df.groupby('Patient')['Date']
.apply(lambda x: x.diff().dt.days.cumsum()).fillna(0).astype(int)
Patient Date Days
0 2 2005-08-17 0
1 2 2006-07-03 320
2 2 2008-08-27 1106
3 2 2010-09-22 1862
4 2 2011-09-20 2225
5 2 2012-01-10 2337
6 3 2006-03-13 0
7 3 2006-12-09 271
8 3 2007-12-09 636
9 4 2005-08-18 0
10 4 2006-03-05 199
11 4 2008-11-25 1195
12 5 2005-08-23 0
14 5 2006-06-09 290
13 5 2006-09-03 376
这里有一种使用
apply
In [178]: df.groupby('Patient').Date.apply(lambda x: x - x.min()).dt.days
Out[178]:
0 0
1 320
2 1106
3 1862
4 2225
5 2337
6 0
7 271
8 636
9 0
10 199
11 1195
12 0
13 376
14 290
Name: Date, dtype: int64
细节
In [179]: df['Days'] = df.groupby('Patient').Date.apply(lambda x: x - x.min()).dt.days
In [180]: df
Out[180]:
Patient Date Days
0 2 2005-08-17 0
1 2 2006-07-03 320
2 2 2008-08-27 1106
3 2 2010-09-22 1862
4 2 2011-09-20 2225
5 2 2012-01-10 2337
6 3 2006-03-13 0
7 3 2006-12-09 271
8 3 2007-12-09 636
9 4 2005-08-18 0
10 4 2006-03-05 199
11 4 2008-11-25 1195
12 5 2005-08-23 0
13 5 2006-09-03 376
14 5 2006-06-09 290
或者,使用transform
df.groupby('Patient').Date.transform(lambda x: x - x.min()).dt.days
非常感谢您不确定这是否有什么不同,但我正在考虑将lamba x:x.diff().dt.days.cumsum()作为替代方案……太棒了,谢谢。对于绘图,我在使用pivot_table函数时遇到了很多问题,该表转换得很好,但我无法正确索引键以绘制正确的轴与索引。最后,我使用'for key,grp In csv_file_variable.groupby('Patient'):plt.plot(grp.Days,grp.Test_Result,label=key')以迭代方式绘制了该图。很高兴能帮上忙!如果我的答案有用,别忘了-点击复选标记(
✓答案旁边的代码>),将其从灰显切换为填充。谢谢
df['Date'] = pd.to_datetime(df['Date'])
df = df.sort_values(['Patient','Date'])
df['Days'] = df.groupby('Patient')['Date']
.apply(lambda x: x.diff().dt.days.cumsum()).fillna(0).astype(int)
Patient Date Days
0 2 2005-08-17 0
1 2 2006-07-03 320
2 2 2008-08-27 1106
3 2 2010-09-22 1862
4 2 2011-09-20 2225
5 2 2012-01-10 2337
6 3 2006-03-13 0
7 3 2006-12-09 271
8 3 2007-12-09 636
9 4 2005-08-18 0
10 4 2006-03-05 199
11 4 2008-11-25 1195
12 5 2005-08-23 0
14 5 2006-06-09 290
13 5 2006-09-03 376
In [178]: df.groupby('Patient').Date.apply(lambda x: x - x.min()).dt.days
Out[178]:
0 0
1 320
2 1106
3 1862
4 2225
5 2337
6 0
7 271
8 636
9 0
10 199
11 1195
12 0
13 376
14 290
Name: Date, dtype: int64
In [179]: df['Days'] = df.groupby('Patient').Date.apply(lambda x: x - x.min()).dt.days
In [180]: df
Out[180]:
Patient Date Days
0 2 2005-08-17 0
1 2 2006-07-03 320
2 2 2008-08-27 1106
3 2 2010-09-22 1862
4 2 2011-09-20 2225
5 2 2012-01-10 2337
6 3 2006-03-13 0
7 3 2006-12-09 271
8 3 2007-12-09 636
9 4 2005-08-18 0
10 4 2006-03-05 199
11 4 2008-11-25 1195
12 5 2005-08-23 0
13 5 2006-09-03 376
14 5 2006-06-09 290
df.groupby('Patient').Date.transform(lambda x: x - x.min()).dt.days