为了账号安全,请及时绑定邮箱和手机立即绑定

日期之间的任何差异超过阈值

日期之间的任何差异超过阈值

慕姐8265434 2023-03-08 15:24:28
我有一个熊猫数据框列,其中每一行都包含一个日期列表。我想创建一个标志来标识列表中的任何日期是否与“任何”其他日期相隔 7 天例如list = ['2019-10-22','2019-10-24','2019-10-29']这应该导致错误,因为最后一个(元素)日期与其他日期中的至少一个相隔超过 7 天这种情况在数据框的每一行中重复出现谢谢
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

一种方法是使用explode、转换为datetime和聚合使用np.ptp。我创建了一个小型测试 DF 来运行它。


import pandas as pd

import numpy as np


df = pd.DataFrame({'something': [1,2],

    'dates':[['2019-10-22','2019-10-24','2019-10-29'], ['2019-10-21','2019-10-12','2019-10-19']]})


df['sevendays'] = df.dates.explode().astype('datetime64[ns]').groupby(level=0).agg(np.ptp).dt.days <= 7



print(df)


   something                                 dates  sevendays

0          1  [2019-10-22, 2019-10-24, 2019-10-29]       True

1          2  [2019-10-21, 2019-10-12, 2019-10-19]      False

在您的问题中,您提到 7 天和超过 7 天都是截止点。目前会False超过7天,您可以根据需要调整解决方案。


查看完整回答
反对 回复 2023-03-08
?
慕慕森

TA贡献1856条经验 获得超17个赞

这是另一个使用函数然后apply使用表达式的选项lambda逻辑与@ScootCork 在他的回答( )中使用的逻辑基本相同np.ptp,只是列表没有展开。这在性能方面应该稍微好一些。


import numpy as np

import pandas as pd


def check_in_range(dates, maxdelta):

    dti = pd.to_datetime(dates)

    return np.absolute(np.ptp(dti.values).astype(np.float) / 1e9) <= maxdelta


df = pd.DataFrame({'dates':[['2019-10-22','2019-10-24','2019-10-29', '2019-10-21'],

                            ['2019-10-23','2019-10-20','2019-10-12'],

                            ['2019-10-22','2019-10-24','2019-10-29']]})


df['inrange'] = df['dates'].apply(lambda r: check_in_range(r, 86400*7))

# df['inrange']

# 0    False

# 1    False

# 2     True


查看完整回答
反对 回复 2023-03-08
  • 2 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信