gpt4 book ai didi

python - 使用每年的唯一日期范围在数据框中创建一个新列

转载 作者:行者123 更新时间:2023-11-30 22:10:12 25 4
gpt4 key购买 nike

我有一个以下形式的数据框:

df = pd.DataFrame({'Date':['2017-01-01', '2017-02-13', '2018-03-01', '2018-04-01'], 'Value':[1,2,3,4]})

对于每一年,我都有一个不同的日期范围(例如,2017 年从 2017-02-02 到 2017-02-15,2018 年从 2018-03-03 到 2018-04-04)存储为字典。

dates_dict = {2017: ('2017-02-02', '2017-02-15'), 2018: ('2018-03-03', '2018-04-04')}

我想要在我的数据框中创建一个新列,如果日期在该年份的日期范围内,则该列为 True,否则为 False。对于给定的示例,输出将是:

df =    Date        Value  in_range
0 2017-01-01 1 False
1 2017-02-13 2 True
2 2018-03-01 3 False
3 2018-04-01 4 True

我当前的解决方案是:

temp = []
for name, group in df.groupby(df['Date'].dt.year):
temp.append((group['Date'] >= dates_dict[name][0]) & (group['Date'] <=
dates_dict[name][1]))
in_range = pd.concat(temp)
in_range = in_range.rename('in_range')
df = df.merge(in_range.to_frame(), left_index=True, right_index=True)

这可行,但我确信有一种更简洁的方法可以实现这一目标。更一般地说,是否有更好的方法来检查日期是否在大量日期范围内?

最佳答案

设置

您可以通过将字典转换为实际包含 pd.date_range 来提高解决方案的效率。这两种解决方案都假设您进行了此转换:

dates_dict = {k: pd.date_range(s, e) for k, (s, e) in dates_dict.items()}

选项 1
使用 apply 进行字典查找:

df.Date.apply(lambda x: x in dates_dict[x.year], 1)

0 False
1 True
2 False
3 True
Name: Date, dtype: bool

选项 2
使用列表理解的性能稍高的选项:

df['in_range'] = [i in dates_dict[i.year] for i in df.Date]

Date Value in_range
0 2017-01-01 1 False
1 2017-02-13 2 True
2 2018-03-01 3 False
3 2018-04-01 4 True

时间

In [208]: %timeit df.Date.apply(lambda x: x in dates_dict[x.year], 1)
289 ms ± 5.77 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [209]: %timeit [i in dates_dict[i.year] for i in df.Date]
284 ms ± 6.26 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 使用每年的唯一日期范围在数据框中创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51714580/

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