Ответ Янеза дал именно ту информацию, которая мне была нужна, спасибо.
Здесь я публикую код для скрипта python в Orange, чтобы дать полное решение проблемы.
from Orange.data import Domain, TimeVariable, ContinuousVariable, StringVariable, Table
# toISODate: parse the date string and returns it in ISO format
def toISODate(s):
bits = s.split('/')
year = '20'+bits[2];
day = bits[1]
day = day if len(day)==2 else '0'+day
month = bits[0]
month = month if len(month)==2 else '0'+month
return year+'-'+month+'-'+day
# Prepare output domain
tmVar = TimeVariable.make("Date");
out_domain = Domain([ContinuousVariable.make("Lat"),
ContinuousVariable.make("Long"),
tmVar,
ContinuousVariable.make("Count")],
[],
[StringVariable.make("Country"),
StringVariable.make("Region")]
)
# Prepare output source - list of lists
out_source = []
in_domain = in_data.domain # not really needed
in_width = len(in_domain) # oops - thank you @community for the reminder
# outer loop through original data rows
for in_row in in_data:
lat, long = in_row[0], in_row[1] # grab latitute, longitude
country, region = in_row.metas[1], in_row.metas[0]
# inner loop through dates in each row
for j in range(2,in_width):
date = tmVar.parse(toISODate(in_domain[j].name)) # find date (in clolumn names), parse to UNIX
# make new row: lat, long, date, number of cases, country, region
out_row = [lat, long, date, in_row[j], country, region]
out_source.append(out_row)
# end
# end in_row
# Make data from the list
out_data = Table.from_list(out_domain,out_source)
В идеале код должен быть написан так, чтобы в общем случае иметь дело с любой матрицей (превращение столбца x, строки y, значения в высокую таблицу с тремя столбцами x, y, значением; затем работа с дополнительными столбцами). Мой Python не до этого (пока).
Кроме того, можно заменить значение «in_width» во внутреннем l oop на «in_data.domain.attributes». это гарантирует, что l oop покроет постоянно увеличивающийся nb столбцов (один новый каждый день)