Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化从具有年中日期值(doy)的二维numpy数组到具有日期值的数组的转换_Python_Arrays_Datetime - Fatal编程技术网

Python 优化从具有年中日期值(doy)的二维numpy数组到具有日期值的数组的转换

Python 优化从具有年中日期值(doy)的二维numpy数组到具有日期值的数组的转换,python,arrays,datetime,Python,Arrays,Datetime,有人知道如何优化从具有年度日期值(doy)的2维numpy阵列到 具有日期值的数组? 下面的函数起作用,但不幸的是,它的方式非常不雅观。如果有人有好主意,我会很高兴 如何避免2维数组上的循环,这将使大型数据集的计算速度更快 import datetime from datetime import date #test 2-dim array with doy values doy = np.array([[272, 272], [274, 274]]) #de

有人知道如何优化从具有年度日期值(doy)的2维numpy阵列到 具有日期值的数组? 下面的函数起作用,但不幸的是,它的方式非常不雅观。如果有人有好主意,我会很高兴 如何避免2维数组上的循环,这将使大型数据集的计算速度更快

import datetime
from datetime import date

#test 2-dim array with doy values
doy = np.array([[272, 272],
                [274, 274]])

#define start and end date
startdat = datetime.datetime.strptime('2012 10 01 0000', '%Y %m %d %H%M')
year_start = int(startdat.strftime('%Y'))
enddat = datetime.datetime.strptime('2013 09 30 0000', '%Y %m %d %H%M')
year_end = int(enddat.strftime('%Y'))

#initialise an tmp array
res_date = np.zeros([2,2]) 

#transform doy into date    
for x in range(2):
    for y in range(2):
        if doy[x,y] >= 274 and doy[x,y] <= 365:
            datum = date.fromordinal(date(year_start, 1, 1).toordinal() + doy[x,y])
            datum = datum.strftime('%Y%m%d')    
            res_date[x,y]= datum
        else:
            datum = date.fromordinal(date(year_end, 1, 1).toordinal() + doy[x,y])
            datum = datum.strftime('%Y%m%d')    
            res_date[x,y]= datum
#that's my result
#res_date = array([[ 20130930.,  20130930.],
                  #[ 20121001.,  20121001.]])  
导入日期时间
起始日期时间导入日期
#使用doy值测试2-dim阵列
doy=np.array([[272272],
[274, 274]])
#定义开始和结束日期
startdat=datetime.datetime.StrTime('2012 10 01 0000','%Y%m%d%H%m')
年份_start=int(startdat.strftime(“%Y”))
enddat=datetime.datetime.strtime('2013 09 30 0000','%Y%m%d%H%m')
年份_end=int(enddat.strftime(“%Y”))
#初始化tmp阵列
res_date=np.zero([2,2])
#将doy转换为date
对于范围(2)内的x:
对于范围(2)内的y:

如果doy[x,y]>=274并且doy[x,y]你可以做这种事情

offset = (datetime.datetime(2013, 9, 30) - datetime.datetime(2012, 12, 31)).days
yearlen = (datetime.datetime(2013, 1, 1) - datetime.datetime(2012, 1, 1)).days
doy[doy >= offset] -= yearlen
dates = np.datetime64('2013-01-01') + doy
但是从datetime64值中提取YMD有点棘手。共识是使用熊猫。为什么需要使用这种格式的数组

编辑,我已经添加了计算年份,但我还没有考虑所有的排列,你可能需要用日历检查一下

进一步编辑。从你下一个问题的措辞来看,你的doy看起来只是从2011年9月30日(或从2011年10月1日减1日)算起的天数。i、 e


因为这么晚才挂雨篷。我希望我能找到一种方法在这段时间里四处走动 转化。但不幸的是,我们没有办法,我仍然对这一切感到困惑 转变、日班和闰年。 我的问题仍然是:如何从我的doy时间值中获得一个正确的日期,它开始计算一个时间 从1年开始。十月到三十号。九月的一天。所以为了得到 一个正确的日期超出了这个doy时间值,我试图先更正偏移量。上次我给你钱的时候 更正了偏移值,您给了ma一个优雅的代码,将相应的doy转换为 约会。其次,我试着把修正后的doys转换成日期。 在下面,您可以找到完整的代码,包括您的部分。该代码对于非结构化应用程序运行良好 闰年。但我仍然不知道如何处理闰年,甚至不知道如何获得一个正确的日期 闰年。也许你知道如何处理闰年,也许你有 更好的偏移校正方法。但我的约会在闰年内,包括 抵消2天。哦,这个日期时间转换确实有点混乱。 如果你知道如何处理这个问题,那就太好了。谢谢大家

将doy转换为日期
#导入模块
将numpy作为np导入
导入日期时间
导入副本
#测试数据
#从1开始数数睡鼠。10月30日至9月30日
doy=np.array([[152,4],
[7, 93]])
#读取开始和结束数据
startdat=datetime.datetime.StrTime('2011 10 01 0000','%Y%m%d%H%m')
enddat=datetime.datetime.strtime('2012 09 30 0000','%Y%m%d%H%m')
年份\u startdat=int(startdat.strftime(“%Y”))
年份_enddat=int(enddat.strftime(“%Y”))
yeardays=(enddat-startdat)+datetime.timedelta(days=1)
#更正doy偏移,以便将doy转换为日期
doy_corr=copy.copy(开始最大值)
如果yeardays==datetime.timedelta(366):
“是闰年!”
doy_corr[(doy>=1.)和(doy=93.)和(doy=1.)和(doy=93.)和(doy=offset]-=yearlen
日期=np.日期时间64(str(year_enddat)+('-01-01'))+doy_corr
#我的结果应该是
#数组(['2012-02-29','2011-10-04'],
#['2011-10-07','2012-01-01']],dtype='datetime64[D]]
如何用NA值替换np.datetime数组中的零(零表示缺少的值),以及如何将np.datetime64数组转换为浮点或整数数组

#import modules
import numpy as np
import datetime

#counting the doys from the 1. of October to the 30 of September
#Zero stands for NA
doy = np.array([[0, 4],
                [7, 93]])

#define to startdat to receive dates from 1. of October 
startdat = datetime.datetime(2011,10,1)
dates = np.datetime64(startdat).astype('datetime64[D]') + doy - 1
print(dates)
#convert the datetime array into a string
dates_str = np.datetime_as_string(dates)
#replace the false date-values with NA
ind = np.where(dates_str == '2011-09-30')
dates_str[ind] = 'NA'

#My favored result:
#array([[nan, 20111004.],
#       [20111007., '20120101.]], 
#      dtype='float')

您好,非常感谢,您的代码运行得很好!您说的“需要该格式的数组”是什么意思?My res_date array(带有日期值的结果数组)不需要使用数据类型浮点格式。我也不明白“必须使用更多的日期算术来修正闰年”是什么意思!现在我不知道如何有效地处理闰年。是的,使用日期时间格式非常棘手!:)@angi,如果您愿意以日期时间值数组结束,而不是转换为20131001格式,那么这是理想的。关于闰年的一点是,如果doy中的val大于您的年份截止值(比如274),则您希望该值作为上一年的doy,但如果上一年是闰年(如本例所示),则doy 274落在不同的日期,即2012年的doy 274是10月1日,但2013年是第2日。您需要计算出一个值,而不仅仅是使用365。我会做一个编辑。@angi,这是正确的答案吗,或者你需要任何其他帮助吗?亲爱的paddyg,很抱歉这么晚才开始编辑!!我仍然需要datetime转换方面的帮助。我把我的代码贴在下面的awnser上。如果你知道如何处理这个问题,那就太好了。确认一下你想做什么:doy是一个数字,不间断的序列号,被解释为2011-09-30之后的几天。i、 e.doy=1是2011-10-1,doy 92是2011-12-31,doy 93是2012-1-1如果是这种情况,那么您可以将数组添加到日期时间(2011,9,30)
#import modules
import numpy as np
import datetime
import copy

#test_data
#counting the doys from the 1. of October to the 30 of September
doy = np.array([[152, 4],
                [7, 93]])

#read start and enddat
startdat = datetime.datetime.strptime('2011 10 01 0000', '%Y %m %d %H%M')
enddat = datetime.datetime.strptime('2012 09 30 0000', '%Y %m %d %H%M')
year_startdat = int(startdat.strftime('%Y'))
year_enddat = int(enddat.strftime('%Y'))
yeardays = (enddat - startdat) + datetime.timedelta(days=1)

#correct the doy offset in order to transfrom doy into a date
doy_corr = copy.copy(start_max)
if yeardays == datetime.timedelta(366):
    print 'is leap year!'
    doy_corr[(doy >=1.) & (doy <= 92)] += 274
    doy_corr[(doy >=93.) & (doy <= 366)] -= 93
#correct the doy offset if there is no leap year
else:
    print 'no leap year!'    
    doy_corr[(doy >=1.) & (doy <= 92)] += 273
    doy_corr[(doy >=93.) & (doy <= 365)] -= 93

#transform doy corrected into date. The offset is necessary to get the correct year
offset = (datetime.datetime(year_enddat, 9, 30) - datetime.datetime(year_startdat, 12, 31)).days
yearlen = (datetime.datetime(year_enddat, 1, 1) - datetime.datetime(year_startdat, 1, 1)).days
doy_corr[doy_corr >= offset] -= yearlen
dates = np.datetime64(str(year_enddat)+('-01-01')) + doy_corr

#my result should be 
#array([['2012-02-29', '2011-10-04'],
#      ['2011-10-07', '2012-01-01']], dtype='datetime64[D]')
#import modules
import numpy as np
import datetime

#counting the doys from the 1. of October to the 30 of September
#Zero stands for NA
doy = np.array([[0, 4],
                [7, 93]])

#define to startdat to receive dates from 1. of October 
startdat = datetime.datetime(2011,10,1)
dates = np.datetime64(startdat).astype('datetime64[D]') + doy - 1
print(dates)
#convert the datetime array into a string
dates_str = np.datetime_as_string(dates)
#replace the false date-values with NA
ind = np.where(dates_str == '2011-09-30')
dates_str[ind] = 'NA'

#My favored result:
#array([[nan, 20111004.],
#       [20111007., '20120101.]], 
#      dtype='float')