python - Pandas - 计算另一个日期之间的日期
问题描述
我有一个数据集,其中每条记录都有 5 个日期值,然后是另一个日期变量。我想拉出 5 个日期中大于另一个变量的最小日期,或者拉出 5 个日期中较小的最大日期。例子:
date1 date2 date3 date4 date5 date_var result1 result2
jan1 feb1 apr1 sep1 dec1 mar1 apr1 feb1
因此,基本上目标是找出 date_var 介于两个日期中的哪一个(此处为 2 月至 4 月),然后拉出较小或较大的日期。如果重要的话,输入数据已经被清除,使得所有日期的 date1 < date2 < date3 < date4 < date5,尽管它们有可能是 na。
我的解决方案是这样的:
df.loc[df.date_var > date5,'result2'] = date5
df.loc[(df.date_var <= date5) & (df.date_var > date4),'result2'] = date4
df.loc[(df.date_var <= date4) & (df.date_var > date3),'result2'] = date3
...
但这很慢。是否有更快的方法来执行此操作,或者这只是会很慢?谢谢。
解决方案
这是我对这个问题的理解。
- 我们有 5 个日期,使得 d1 < d2 < d3 < d4 < d5。
- 我们也有一个目标日期。
- 找到满足 d_i <= target < d_i+1 的 i
- 结果1是d_i,结果2是d_i+1
这是我的方法:
from collections import namedtuple
import pandas as pd
# create sample data
Record = namedtuple('Record', 'd1 d2 d3 d4 d5 target')
df = pd.DataFrame([
Record('2019-01-01', '2019-02-01', '2019-04-01', '2019-09-01', '2019-12-01', '2019-03-01'),
Record('2020-01-01', '2020-02-01', '2020-04-01', '2020-09-01', '2020-12-01', '2020-03-01'),
])
df = df.astype('datetime64[D]')
# define function to find lower, upper bounding dates
def find_bound(s, target, metric='min'):
assert isinstance(s, pd.Series)
if metric == 'min':
return s[s <= target].max()
else:
return s[s > target].min()
df['min'] = df.apply(lambda x: find_bound(x['d1':'d5'], x['target'], 'min'), axis=1)
df['max'] = df.apply(lambda x: find_bound(x['d1':'d5'], x['target'], 'max'), axis=1)
# verify that lower, upper bounds are correct
df['validate'] = (df['min'] <= df['target']) & (df['target'] < df['max'])
print(df.transpose())
0 1
d1 2019-01-01 2020-01-01
d2 2019-02-01 2020-02-01
d3 2019-04-01 2020-04-01
d4 2019-09-01 2020-09-01
d5 2019-12-01 2020-12-01
target 2019-03-01 2020-03-01
min 2019-02-01 2020-02-01 <- result 1
max 2019-04-01 2020-04-01 <- result 2
validate True True
推荐阅读
- javascript - 未定义不是对象(UIConstants)
- javascript - 使用 python 抓取 javascript:void(0) 内容
- javascript - 如何在不向第一个对象添加额外字段的情况下将具有更多字段的对象分配给具有较少字段的另一个对象?
- pyephem - Pyephem - 行星的度数位置
- javascript - 使用 Javascript 从 HTML 中删除
- python - 打开连接并获得响应需要太多时间
- git - How do I tell git to include my merge commits when doing a soft reset?
- c# - task.Start() 是否在后台运行
- c++ - Implicitly passing parameter(s) to base constructor C++
- oracle - 如何在 Oracle 中将日期字符串“09-JUN-14 12.00.00.000000000 AM”转换为日期格式