代码之家  ›  专栏  ›  技术社区  ›  Ray92

Python日期哈希表

  •  1
  • Ray92  · 技术社区  · 7 年前

    我正在尝试制作一个哈希表,以加快查找特定日期与假日日期之间差异的过程(我有一个包含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万个日期与最近的假日之间的差值。我不想做数百万次相同的计算,这就是为什么我想使用哈希表来进行计算。

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

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

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

    谢谢你的帮助!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Hannu    7 年前

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

    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。日期对象,而不是原始字符串。它有一个内置函数,可以将“yyyy-mm-dd”字符串转换为datetime。尽管是日期。

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

    无论如何,这应该给你一个方法。