def time_crop(f_init_date, f_final_date, delta, f_time_array, data_array, multiple=False):
"""
Crop the data_array between f_init_date and f_final_date.
:param f_init_date: Float. Initial date
:param f_final_date: Float. Final date
:param delta: a datetime instance to step in dates
:param f_time_array: Float array. All dates of data_array
:param data_array: The data to be cropped. Its shape must be of the form (time, ...)
:param multiple: False, just one data_array. True a list of data_arrays.
:return: Cropped data and according datetime list.
"""
i_start = np.where(np.array(f_time_array) >= f_init_date)[0][0]
i_end = np.where(np.array(f_time_array) <= f_final_date + 23 / 24.)[0][-1]
# TODO: Refactor this while. You can transform delta and operate only on f_dates and then convert the entire list.
d_date = num2date(f_init_date).replace(minute=0)
d_Time = []
f_Time = []
while f_init_date <= f_final_date + 23 / 24.:
d_Time.append(d_date)
f_Time.append(date2num(d_date))
d_date = d_date + delta
f_init_date = date2num(d_date)
if multiple:
all_cropped_data = []
for data in data_array:
new_shape = [len(d_Time)]
new_shape.extend(list(data.shape[1:]))
new_shape = tuple(new_shape)
cropped_data = np.empty(new_shape)
cropped_data.fill(np.nan)
# TODO: Use find_nearest
cropped_data[np.in1d(f_Time, f_time_array[i_start:i_end + 1])] = data[i_start:i_end + 1]
all_cropped_data.append(cropped_data)
return all_cropped_data, d_Time
else:
new_shape = [len(d_Time)]
new_shape.extend(list(data_array.shape[1:]))
new_shape = tuple(new_shape)
cropped_data = np.empty(new_shape)
cropped_data.fill(np.nan)
cropped_data[np.in1d(f_Time, f_time_array[i_start:i_end + 1])] = data_array[i_start:i_end + 1]
return cropped_data, d_Time
评论列表
文章目录