【问题标题】:Python Dates HashtablePython 日期哈希表
【发布时间】:2018-03-26 15:55:49
【问题描述】:

我正在尝试制作一个哈希表来加快查找特定日期与假日日期之间差异的过程(我有一个包含 10 个假日日期的列表)。

holidays =['2014-01-01', '2014-01-20', '2014-02-17', '2014-05-26',
        '2014-07-04', '2014-09-01', '2014-10-13', '2013-11-11',
        '2013-11-28', '2013-12-25'] 

from datetime import datetime

holidaydate=[]

for i in range(10):
    holidaydate.append(datetime.strptime(holidays[i], '%Y-%m-%d'))


newdate=pd.to_datetime(df.YEAR*10000+df.MONTH*100+df.DAY_OF_MONTH,format='%Y-%m-%d')
#newdate contains all the 0.5 million of dates!

现在我想使用哈希表来计算“newdate”中的 50 万个日期中的每一个与最近的假期之间的差异。我不想做同样的计算数百万次,这就是为什么我想为此使用哈希表。

我尝试在谷歌上搜索解决方案,但只找到了以下内容:

keys = ['a', 'b', 'c']
values = [1, 2, 3]
hash = {k:v for k, v in zip(keys, values)}

这在我的情况下不起作用。

感谢您的帮助!

【问题讨论】:

  • 我不遵循您的需求。首先,我看不到您在哪里设置了哈希表,甚至没有研究过哈希表。其次,你会在哪里进行数百万次重复计算?我看到一张包含 50 万种不同计算的表格。因为你可以用一个相对简单的函数来解决这个问题,如果你想避免重复一些测试,我不确定你需要什么来实现最终功能。

标签: python datetime hashtable


【解决方案1】:

您需要先创建表。像这样。

import datetime

holidays =['2014-01-01', '2014-01-20', '2014-02-17', '2014-05-26',
        '2014-07-04', '2014-09-01', '2014-10-13', '2013-11-11',
        '2013-11-28', '2013-12-25'] 

hdates = []


def return_date(txt):
    _t = txt.split("-")
    return datetime.date(int(_t[0]), int(_t[1]), int(_t[2]))

def find_closest(d):
    _d = min(hdates, key=lambda x:abs(x-d))
    _diff = abs(_d - d).days
    return _d, _diff

# Convert holidays to datetime.date    
for h in holidays:
    hdates.append(return_date(h))

# Build the "hash" table
hash_table = {}

i_date = datetime.date(2013, 1, 1)

while i_date < datetime.date(2016,1,1):
    cd, cdiff = find_closest(i_date)
    hash_table[i_date] = {"date": cd, "difference": cdiff}
    i_date = i_date + datetime.timedelta(days=1)

print hash_table[datetime.date(2014,10,15)]

这适用于 datetime.date 对象而不是原始字符串。它有一个内置函数可以将“yyyy-mm-dd”字符串转换为 datetime.date。

这将为 2013 年 1 月 1 日至 2015 年 12 月 31 日之间的所有日期创建一个哈希表,然后仅使用一个日期对其进行测试。然后,您将循环您的 50 万个日期并匹配此字典中的结果(键是 datetime.date 对象,但如果您愿意,当然可以将其转换回字符串)。

无论如何,这应该让您知道如何执行此操作。

【讨论】:

  • 如果要测试 50 万行数据,则必须循环 50 万次。没有办法解决这个问题。但是如果你说 10 个假期,你会在蛮力方法中需要做 50 万 * 10 (比较每个日期到每个假期)。该表将帮助您将其减少到 0.5m * 1 + N*10,其中 N 是数据集中第一个日期和最后一个日期之间的天数差。它将提高性能。
  • 是的,他跑了365次生成哈希表。如果你看看他的解决方案,他会做我现在正在做的事情。他没有将每 590 万行与每个假期(在他的例子中)进行比较,而是将每个假期与 365 天进行比较。他表达自己的方式可能不是最清楚的(“我们可以在 590 万行的每一行上运行这个函数”),但他清楚地提到了“函数”,在这种情况下,“函数”就是找到离相关日期最近的假期。
  • 没有神奇的哈希表可以让您将 500000 行与仅进行 365 次比较的内容进行比较。即使您的 500000 行就像真或假一样简单,并且您需要分析数据,您也需要遍历它来计算真假。
  • 但是他成功的做法是和我这里做的一样:他没有将 590 万行与假期表中的 N 项进行比较,而是将每一行与哈希表中的一项进行比较,从而大大减少了循环。
  • 确保您创建的是 datetime.date 对象而不是 datetime 对象。如果您的源数据格式为 yyyy-mm-dd,您可能应该使用该格式的字符串键创建字典。这将减少日期时间转换的需求,因为您不需要将 5,000,000 个字符串转换为日期时间,而是匹配字符串。如果它不起作用,这也将更容易调试。只是一个想法。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 2013-03-23
  • 1970-01-01
  • 2014-11-01
  • 2023-03-31
  • 2016-03-20
  • 2023-03-27
  • 2012-09-16
相关资源
最近更新 更多