Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在python中,如何将日期列表转换为首次访问后的天数?_Python 3.x_Pandas_Numpy - Fatal编程技术网

Python 3.x 在python中,如何将日期列表转换为首次访问后的天数?

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 | |

我有一个显示医院就诊日期和患者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 |
|       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 |
我认为你需要:

  • 转换列
    日期
  • 按列
    患者
    日期
    ,如有必要
  • 并获取差异,将
    NaN
    s替换为
    0
  • timedelta
    s按转换为天

绘图

我认为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