Python 熊猫:这是从索引中获取最接近日期的最正确方法吗?

Python 熊猫:这是从索引中获取最接近日期的最正确方法吗?,python,pandas,data-analysis,Python,Pandas,Data Analysis,我有一些数据如下: data=pd.系列([1,2,3,4],索引=['2021/01/01','2020/01/02','2020/01/04','2020/01/05']) 我想得到与传递日期参数相关的闭合索引: def句柄(数据,结束日期): 通过 句柄(数据'2020/01/03') 我想知道,以下代码是否是最合适的方法: def句柄(数据,结束日期): end_date=data.index[data.index我认为您的解决方案很好,这里有一个替代方案: 对于一般解决方案: d

我有一些数据如下:

data=pd.系列([1,2,3,4],索引=['2021/01/01','2020/01/02','2020/01/04','2020/01/05'])
我想得到与传递日期参数相关的闭合索引:

def句柄(数据,结束日期):
通过
句柄(数据'2020/01/03')
我想知道,以下代码是否是最合适的方法:

def句柄(数据,结束日期):

end_date=data.index[data.index我认为您的解决方案很好,这里有一个替代方案:


对于一般解决方案:

def handle(data, end_date):
  end_date = data.index[data.index <= end_date]
  return end_date[-1] if len(end_date) > 0 else 'no match'

print (handle(data, '2020/01/02'))
2020-01-02 00:00:00
print (handle(data, '2020/01/03'))
2020-01-02 00:00:00
print (handle(data, '2020/01/01'))
no match

我认为您的解决方案很好,这里有一个替代方案:


对于一般解决方案:

def handle(data, end_date):
  end_date = data.index[data.index <= end_date]
  return end_date[-1] if len(end_date) > 0 else 'no match'

print (handle(data, '2020/01/02'))
2020-01-02 00:00:00
print (handle(data, '2020/01/03'))
2020-01-02 00:00:00
print (handle(data, '2020/01/01'))
no match

如果您关心大型数据集的效率,我建议您使用二进制搜索

从对分导入左对分
数据=['2021/01/01','2020/01/02','2020/01/04','2020/01/05']
数据=已排序(数据)
def搜索(数据、结束日期):
idx=左二等分(数据、结束日期)-1
如果idx>=0,则返回数据[idx],否则为“不匹配”
搜索(数据'2020/01/03')
# '2020/01/02'

如果数据不是很大,那么您最初的想法完全正确。

如果您关心大数据集的效率,我建议您使用二进制搜索

从对分导入左对分
数据=['2021/01/01','2020/01/02','2020/01/04','2020/01/05']
数据=已排序(数据)
def搜索(数据、结束日期):
idx=左二等分(数据、结束日期)-1
如果idx>=0,则返回数据[idx],否则为“不匹配”
搜索(数据'2020/01/03')
# '2020/01/02'

如果数据不大,您最初的想法完全正确。

谢谢您的回答。我发现特定格式“yyy/mm/dd”也可以排序,因此可能不需要转换为datetime。@运行-我的意见-处理字符串
yyy/mm/dd
,如果性能重要,如果大数据最好转换为datetimetant。谢谢您的回答。我发现特定格式“yyyy/mm/dd”也可以排序,因此可能不需要将其转换为日期时间。@运行-我的意见-处理字符串
yyy/mm/dd
,如果性能重要,大数据最好转换为日期时间。
def handle(data, end_date):
  end_date = data.index[data.index <= end_date]
  return end_date[-1] if len(end_date) > 0 else 'no match'

print (handle(data, '2020/01/02'))
2020-01-02 00:00:00
print (handle(data, '2020/01/03'))
2020-01-02 00:00:00
print (handle(data, '2020/01/01'))
no match
def handle(data, end_date):
      idx = data.index.searchsorted(end_date, side='right') - 1
      return  data.index[idx] if idx != -1 else 'no match'
 

print (handle(data, '2020/01/02'))
2020-01-02 00:00:00
print (handle(data, '2020/01/03'))
2020-01-02 00:00:00
print (handle(data, '2020/01/01'))
no match