python大于某个日期_如果两个日期之间的间隔超过某个特定条件,请停止对熊猫进行重新采样...

博客讨论了如何在处理包含ID、时间、值和时间间隔的数据框时,根据ID独立进行10分钟间隔的重采样。当连续时间间隔超过0.86小时时,希望停止重采样并保留原始行。通过创建临时列'ID_res'并在条件满足时增加其值,实现了这一目标。最后,利用'ID_res'进行分组,保持'ID'和'Value'列,并进行重采样及插值。
摘要由CSDN通过智能技术生成

我有这个数据框。我的数据框包含ID,时间和值以及缺口(小时)。我正在独立于每个ID进行重新采样。间隔列给出两个不同时间之间的连续时间间隔。我每10分钟进行一次重新采样,并且如果连续的间隙大于0.86 Hr,我想停止重新采样,并返回下一行作为原始行,并在发现相同条件时再次继续重新采样。我的差距情况像这样

a (abs(a-b))

b 0

样本数据

ID,Time,Value,Gaps

1,1523147332607,2,0.3347541666666667

1,1523148537722,5,0.17346666666666666

1,1523149162202,6,1.6252830555555555

1,1523155013221,4,0.33290027777777775

1,1523156211662,7,0.3722580555555556

1,1523157551791,10,0.0

2,1523156211662,5,0.5115911111111111

2,1523158053390,2,0.3405525

2,1523159279379,9,1.3295477777777778

2,1523164065751,3,0.0

如您所见,ID 1的间隙超过0.86 Hr,所以我的想法是在该点停止重新采样。像这样

ID,Time,Value,Gaps

1,1523147332607,2,0.3347541666666667

...................................

1,1523148537722,5,0.17346666666666666

...................................

...................................

1,1523149162202,6,1.6252830555555555

因此,我要继续对此进行重新采样,Time period 1523149162202并且在没有更多采样要做时,我希望将此最后一行返回为原始行,即

1,1523149162202,6,1.6252830555555555

然后,我要继续从下一行重新采样

1,1523155013221,4,0.33290027777777775

1,1523156211662,7,0.3722580555555556

1,1523157551791,10,0.0

这继续

对于每个ID的正常重采样,

df = df.set_index(['Time'])

df.index = pd.to_datetime(df.index, unit='ms')

df = (df.groupby('ID', axis=0)['Value']

.resample('10min')

.mean()

.groupby(level=0)

.apply(lambda x: x.interpolate()).reset_index())

但是,如何跟踪每个重新采样,以便在遇到某些条件时可以停止重新采样,并在最后的采样部分返回原始行。然后,它从下一行再次继续相同的条件。我当时想使用,np.where但我离实现这一目标还遥遥无期。有什么建议 ?

解决方案

一种方法是在中创建一个临时列'ID_res'df,在更改ID时或在间隙超过0.86之后的行中递增数字,例如:

df.loc[(df['ID'] != df['ID'].shift())| (df['Gaps'].shift() > 0.86),'ID_res'] = 1

df['ID_res'] = df['ID_res'].cumsum().ffill()

所以您的df看起来像:

ID Value Gaps ID_res

Time

2018-04-08 00:28:52.607 1 2 0.334754 1.0

2018-04-08 00:48:57.722 1 5 0.173467 1.0

2018-04-08 00:59:22.202 1 6 1.625283 1.0

2018-04-08 02:36:53.221 1 4 0.332900 2.0

2018-04-08 02:56:51.662 1 7 0.372258 2.0

2018-04-08 03:19:11.791 1 10 0.000000 2.0

2018-04-08 02:56:51.662 2 5 0.511591 3.0

2018-04-08 03:27:33.390 2 2 0.340553 3.0

2018-04-08 03:47:59.379 2 9 1.329548 3.0

2018-04-08 05:07:45.751 2 3 0.000000 4.0

现在,您可以使用在“ ID_res”上进行第一个分组依据时使用的方法,同时保留“ ID”和“ Value”列,并在结尾处删除“ ID_res”列,因为不再需要它:

df = (df.groupby('ID_res', axis=0)['ID','Value'].resample('10min').mean()

.groupby(level=0).apply(lambda x: x.interpolate())

.reset_index().drop('ID_res',1))

结果看起来像:

Time ID Value

0 2018-04-08 00:20:00 1.0 2.0

1 2018-04-08 00:30:00 1.0 3.5

2 2018-04-08 00:40:00 1.0 5.0

3 2018-04-08 00:50:00 1.0 6.0

4 2018-04-08 02:30:00 1.0 4.0

5 2018-04-08 02:40:00 1.0 5.5

6 2018-04-08 02:50:00 1.0 7.0

...

在第3行和第4行之间没有重新采样的情况下,原始值与这些值之间的“间隙”超过0.86df

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值