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天,您可以根据需要调整解决方案。
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
添加回答
举报