2016-09-18 3 views
1

У вас есть идея, как я могу получить элементный день года из массива numat datetime? С моим кодом я могу получить только день года для одного элемента массива. Как я могу получить день года для каждого элемента массива? Вот мой код (включая код):Как получить элементный день года из массива numat datetime?

#import modules 
import numpy as np 
import pandas as pd 
import datetime 
from datetime import datetime 

#date values in an numpy array as int 
data_int = np.array([[20131001, 20131001, 20131001], 
        [20131002, 20131002, 20131002], 
        [20131002, 20131002, 20131002]]) 
#transform the data_int array in a datetime list 
data_list = [pd.to_datetime(pd.Series(x), format="%Y%m%d") for x in data_int] 
#transform the datetime list back to an datetime array with dtype='datetime64[ns]') 
data = np.asarray(data_list, dtype='datetime64', order=None) 
#convert dtype='datetime64[ns]' into a datetime.date object 
data_date = data.astype('M8[D]').astype('O') 
#get the day of the year from the the data_date array. 
day_of_year = data_date[0,1].timetuple().tm_yday 
#274 

Было бы замечательно, если вы или кто-то еще имеет хорошую идею для меня !! Спасибо!

ответ

0
import numpy as np 
import pandas as pd 

#date values in an numpy array as int 
data_int = np.array([[20131001, 20131001, 20131001], 
        [20131002, 20131002, 20131002], 
        [20131002, 20131002, 20131002]]) 
#transform the data_int array in a datetime list 
data_list = [pd.to_datetime(pd.Series(x), format="%Y%m%d") for x in data_int] 
doy = pd.DataFrame([x.apply(lambda x: x.timetuple().tm_yday) for x in data_list]).values 
print(doy) 

Выход:

[[274 274 274] 
[275 275 275] 
[275 275 275]] 
+0

Hi Ophir Carmi, thx очень много для вашей помощи. Теперь очень просто рассчитать день года! Но у меня есть еще один вопрос. Мне нужно начать расчет в 1 октября. Поэтому я немного изменил ваш код, и он работает. Но есть один недостаток: выходной массив имеет другую форму (вместо этого (3,3), у меня есть форма (3,1). Что не так? Это должно иметь какое-то отношение к итерации ... Было бы здорово, если бы У вас есть идея исправить эту проблему. Приветствия, – angi

+0

Вы найдете модифицированный код в Awnser2. Приветствия, – angi

0

Вот мой модифицированный код, который начинается день года caluculation на 1. октября. К сожалению с этим кодом я получаю неправильную форму массива numpy. Вместо формы с (3,3) я получаю форму с (3.1). Зачем??? Я очень рад за любые хорошие идеи для решения этой проблемы.

#import modules 
import pandas as pd 
import numpy as np 

#test numpy array 
data_int = np.array([[0., 20131001., 20131001.], 
        [20131002., 20131002., 20131002.], 
        [20131002., 20131002., 20140930.]]) 
#replace zero values with nan in the data_int numpy array 
data_int[data_int==0]=['nan'] 
#transform the data_int array in a datetime list 
data_list = [pd.to_datetime(pd.Series(x), format="%Y%m%d") for x in data_int] 
#create a datetime start date 
start_date = pd.to_datetime(pd.Series('20131001'), format="%Y%m%d") 
#caluculate the day of year. Unfortunately with this function 
#I got an wrong numpy array shape with (3,1) instead of (3.3). 
doy = pd.DataFrame([x.apply(lambda x: x - start_date) for x in data_list]).values 
#print doy. Thats how my result looks right now. 

#array([[  0 
#0 NaT 
#1 0 days 
#2 0 days], 
#  [  0 
#0 1 days 
#1 1 days 
#2 1 days], 
#  [   0 
#0 1 days 
#1 1 days 
#2 364 days]], dtype=object) 

#and that's how my endresult should look like: 
data_out = np.array([[0, 0, 0], 
        [1, 1, 1], 
        [1, 1, 1]])