gpt4 book ai didi

python - 确定日期时间索引是否在日期范围列表内

转载 作者:行者123 更新时间:2023-12-05 09:26:06 31 4
gpt4 key购买 nike

我有以下代码数据...

import pandas as pd, numpy as np
from datetime import datetime
end_dt = datetime.today()
st_dt = (end_dt + pd.DateOffset(-10)).date()
df_index = pd.date_range(st_dt, end_dt)
df = pd.DataFrame(index=df_index, columns=['in_range'])

data = [pd.to_datetime(['2022-11-08','2022-11-10']), pd.to_datetime(['2022-11-13','2022-11-15'])]
dt_ranges = pd.DataFrame(data,columns={'st_dt':'datetimens[64]', 'end_dt': 'datetimens[64]'})

这会产生以下两个数据帧:
df:

            in_range
2022-11-08 NaN
2022-11-09 NaN
2022-11-10 NaN
2022-11-11 NaN
2022-11-12 NaN
2022-11-13 NaN
2022-11-14 NaN
2022-11-15 NaN
2022-11-16 NaN
2022-11-17 NaN
2022-11-18 NaN

和日期范围:

    st_dt       end_dt
0 2022-11-08 2022-11-10
1 2022-11-13 2022-11-15

我想更新“in_range”列以指示索引是否落在第二个数据帧的任何一对开始日期和结束日期内。所以我应该这样结束:

            in_range
2022-11-08 True
2022-11-09 True
2022-11-10 True
2022-11-11 NaN
2022-11-12 NaN
2022-11-13 True
2022-11-14 True
2022-11-15 True
2022-11-16 NaN
2022-11-17 NaN
2022-11-18 NaN

我尝试通过使用 lambda 和迭代来实现这一点。但对我来说这似乎是有效的。

    def in_range(index_date, date_ranges):
for r in date_ranges.values:
if (r[0] >= index_date) & (r[1] <= index_date):
return True
return False

df['in_range'] = df.reset_index().apply(lambda x: in_range(x.date, dt_ranges), axis=1)

尽管代码返回了正确的值,但上面的代码始终将 in_range 设置为 NaN。我怀疑是因为我正在重置索引,所以它无法对齐。另外,如前所述 - 这个解决方案可能效率很低

有没有更像 pythonic/pandemic 的方式来做到这一点?

最佳答案

使用merge_asofboolean indexing :

s = df.index.to_series()
m = (pd.merge_asof(s.rename('st_dt'), dt_ranges)
['end_dt'].ge(s.to_numpy()).to_numpy()
)

df.loc[m, 'in_range'] = True

注意。 dt_ranges 中的间隔应该是非重叠的。

输出:

           in_range
2022-11-08 True
2022-11-09 True
2022-11-10 True
2022-11-11 NaN
2022-11-12 NaN
2022-11-13 True
2022-11-14 True
2022-11-15 True
2022-11-16 NaN
2022-11-17 NaN
2022-11-18 NaN

关于python - 确定日期时间索引是否在日期范围列表内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74495142/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com