需要聪明的循环 - 对DateTime列进行排序并测量拥挤度
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了需要聪明的循环 - 对DateTime列进行排序并测量拥挤度相关的知识,希望对你有一定的参考价值。
我想评估每小时的ER人口。定义如下:人群(小时= x)=未出院的人(小时= x-1)+加入的人(小时= x) - 出院的人(小时= x)
我使用熊猫数据框,注册日期和时间以及出院日期和时间写成'2013-01-01 01:41:01'。
创建这种人群(小时)数据最简单,最优雅的方法是什么?我想过只写一个非常具体的for循环和一个计数函数,但我会很乐意考虑你的见解,然后再先进入这样一个任务(:!
在许多情况下,出院日期和时间是NAN,这是因为这些病例没有出院,而是转移到医院的某个部门。
例
假设我有这个数据集
case RegisterDateTime DischargeDateTime. TransferDateTime
0 '2013-01-01 00:12:00' '2013-01-01 00:48:00' NAN
1 '2013-01-01 00:43:00' '2013-01-01 02:12:00' NAN
2 '2013-01-01 00:56:00' '2013-01-01 01:22:00' NAN
3 '2013-01-01 01:04:00' '2013-01-01 04:12:00' NAN
4 '2013-01-01 01:34:00' '2013-01-01 04:52:00' NAN
5 '2013-01-01 02:01:00' NAN '2013-01-01 05:34:00'
所以我想要一个数据集“人群”,这可以告诉我每天和每小时的人数是多少。在这个例子中我们可以看到人群('2013-01-01',0)= 2(为什么?因为没有预先登记的案例,案例0,1,2在第0小时登记,案例0已经解除 - > 0+ 3-1 = 2)人群('2013-01-01',1)= 3(为什么?案例1,2预先注册,案例3,4在第1小时注册,案例2注册 - > 2 + 2- 1 = 3)我希望现在的想法很清楚。
另外,关于放电和转移,它们相互补充,所以我只需要弄清楚如何将它们连接成一列并擦除NANs
答案
这是一种方法。您在帖子中描述的想法非常多,但这是一系列漫长的步骤。也许,其他人可能会有更短的实施。
import pandas as pd
>>>df
case RegisterDateTime DischargeDateTime TransferDateTime
0 0 1/1/13 0:12 1/1/13 0:48 NaN
1 1 1/1/13 0:43 1/1/13 2:12 NaN
2 2 1/1/13 0:56 1/1/13 1:22 NaN
3 3 1/1/13 1:04 1/1/13 4:12 NaN
4 4 1/1/13 1:34 1/1/13 4:52 NaN
5 5 1/1/13 2:01 NaN 1/1/13 5:34
# Construct population outflow. This is where you merge Discharges with Transfers
df_out = pd.DataFrame([(j,k) if str(k) != 'nan' else (j,v) for j, k, v in zip(df['case'], df['DischargeDateTime'],df['TransferDateTime'])])
df_out.columns = ['out', 'time']
# You can skip this if your column is already in DateTime
df_out['time'] = pd.to_datetime(df_out['time'])
# Needed for resampling
df_out.set_index('time', inplace=True)
df_out = df_out.resample('H').count().cumsum()
# Needed for merging later
df_out.reset_index(inplace=True)
>>>df_out
out
time
2013-01-01 00:00:00 1
2013-01-01 01:00:00 2
2013-01-01 02:00:00 3
2013-01-01 03:00:00 3
2013-01-01 04:00:00 5
2013-01-01 05:00:00 6
# Now, repeat for the population inflow
df_in = df.loc[:, ['case', 'RegisterDateTime']]
df_in.columns = ['in', 'time']
df_in['time'] = pd.to_datetime(df_in['time'])
df_in.set_index('time', inplace=True)
df_in = df_in.resample('H').count().cumsum()
df_in.reset_index(inplace=True)
>>>df_in
in
time
2013-01-01 00:00:00 3
2013-01-01 01:00:00 5
2013-01-01 02:00:00 6
# You can now combine the two
df= pd.merge(df_in, df_out)
df['population'] = df['in'] - df['out']
>>>df
time in out population
0 2013-01-01 00:00:00 3 1 2
1 2013-01-01 01:00:00 5 2 3
2 2013-01-01 02:00:00 6 3 3
以上是关于需要聪明的循环 - 对DateTime列进行排序并测量拥挤度的主要内容,如果未能解决你的问题,请参考以下文章