numpy数组中的时间值到日期时间数组

时间:2013-11-04 14:13:00

标签: python numpy

有一个大型数组,其中列[0]对应于日期,col [1] =月,col [2] =年份和col [3] =小时(后者是浮点数,也包含分钟信息和分数中的秒数,将这些列转换为日期时间数组的最有效方法是什么?

更新如下:我修改了dt.datetime函数,因此它处理数组输入以及小数年,几个月。我还没有对此进行彻底的测试,并且可能有更优雅的方法可以做到这一点,但现在就去了。

from __future__import division

def getrem(input):
    "this function yields the value behind the decimal point"
    import numpy as np
    output=abs(input-np.fix(input))
    return output

def datenum(Yr,Mo=1,Da=1,Hr=0,Mi=0,Se=0,Ms=0):
    "this function works as regular datetime.datetime, but allows for float input"
    import numpy as np    
    import datetime as dt
    import calendar

    #correct faulty zero input
    if Mo<1:
        Mo+=1
    if Da<1:
        Da+=1        

    #distribute the year fraction over days    
    if  getrem(Yr)>0:
        if calendar.isleap(np.floor(Yr)):
            fac=366       
        else:
            fac=365               
        Da=Da+getrem(Yr)*fac
        Yr=int(Yr)
    #if months exceeds 12, pump to years         
    while int(Mo)>12:
        Yr=Yr+1
        Mo=Mo-12
    #distribute fractional months to days              
    if getrem(Mo)>0:
        Da=Da+getrem(Mo)*calendar.monthrange(Yr,int(Mo))[1]
        Mo=int(Mo)
    #datetime input for 28 days always works excess is pumped to timedelta    
    if Da>28:
        extraDa=Da-28
        Da=28
    else:
        extraDa=0 
    # sometimes input is such that you get 0 day or month values, this fixes this anomaly           
    if int(Da)==0:
       Da+=1
    if int(Mo)==0:
       Mo+=1

    #datetime calculation           
    mytime=dt.datetime(int(Yr),int(Mo),int(Da))+dt.timedelta(days=extraDa+getrem(Da),hours=Hr,minutes=Mi,seconds=Se,microseconds=Ms)
    return mytime    

def araydatenum(*args):
    mydatetimes=[datenum(*[a.squeeze()[x] for a in args]) for x in range(len(args[0].squeeze()))]
    return mydatetimes 

1 个答案:

答案 0 :(得分:2)

不能说效率最高,但可以这样轻松完成:

import datetime as dt
mydatetimes = [dt.datetime(x[2], x[1], x[0]) + dt.timedelta(hours=x[3]) for x in myarray]

这会创建一个常规的python列表,而不是一个numpy数组。只需在右侧添加numpy.array( ... )即可使其成为dtype=object的数组。