Нет необходимости отключать проверку даты jQuery (и это может вызвать другие проблемы). Вам просто нужно переопределить метод range
для $.validator
.
По умолчанию он работает с числовыми значениями (а затем возвращается к сопоставлению строк), поэтому вы можете добавить следующий скрипт ( после jquery.validate.js
и jquery.validate.unobtrusive.js
, но не завернуты в $(document).ready
$.validator.methods.range = function(value, element, param) {
if ($(element).attr('data-val-date')) {
var min = $(element).attr('data-val-range-min');
var max = $(element).attr('data-val-range-max');
var date = new Date(value).getTime();
var minDate = new Date(min).getTime();
var maxDate = new Date(max).getTime();
return this.optional(element) || (date >= minDate && date <= maxDate);
}
// use the default method
return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
};
. Затем вы можете использовать RangeAttribute
в своем свойстве
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
public DateTime Date { get; set; }
i = 0
while True:
try:
for j in column_names:
d[j].append(data[i])
i += 1
except Exception as er: #So when i value exceed by data list it comes to exception and it will break the loop as well
print(er, "################")
break
Вы можете перебирать columnn_names
следующим образом:
dic = {key:[] for key in column_names}
dic['name'] = row_names
for t, column_name in enumerate(column_names):
i = t
while i< len(data):
dic[column_name].append(data[i])
i += 3
Перечислять будут автоматически перебирать через t
формы 0 до len(column_names)-1
Если вы используете Python 3.x, как предложено в 159 , вы можете использовать диктант понимания, а затем создать из него DataFrame Pandas, используя имена в качестве индексов строк:
[ 110] На самом деле, промежуточный словарь является вложенным словарем: ключи внешнего словаря являются метками строк (в данном случае это элементы списка row_names
); значение, связанное с каждым ключом, представляет собой словарь, ключами которого являются метки столбцов (т. е. элементы в column_names
), а значения являются соответствующими элементами в списке data
.
Функция from_dict
используется для создания экземпляра DataFrame.
Итак, предыдущий код дает следующий результат:
height weight grade
jack 100 50 A
mick 107 62 B
nick 103 64 C
pick 105 78 D
Во-первых, мы должны понять, как должен выглядеть идеальный словарь для фрейма данных.
Фрейм данных можно представить двумя разными способами:
Один - это традиционный набор строк.
'row 0': ['jack', 100, 50, 'A'],
'row 1': ['mick', 107, 62, 'B']
Тем не менее, есть второе представление, которое более полезно, хотя, возможно, не так интуитивно на первый взгляд.
Коллекция столбцов:
'name': ['jack', 'mick'],
'height': ['100', '107'],
'weight': ['50', '62'],
'grade': ['A', 'B']
Теперь, вот ключевая вещь, которую нужно осознать, 2-е представление более полезно, потому что это представление поддерживается и используется во фреймах данных. ]
Он не сталкивается с конфликтом типов данных в пределах одной группировки (каждый столбец должен иметь 1 фиксированный тип данных) Однако в представлении строки типы данных могут различаться.
Кроме того, операции могут выполняться легко и согласованно для всего столбца из-за этой согласованности, которую нельзя гарантировать подряд.
Итак, tl; dr DataFrames по сути являются коллекциями столбцов одинаковой длины.
Таким образом, словарь в этом представлении может быть легко преобразован в DataFrame.
column_names = ["name", "height" , "weight", "grade"] # Actual list has 10 entries
row_names = ["jack", "mick"]
data = [100, 50,'A', 107, 62,'B'] # The actual list has 1640 entries
Итак, имея в виду, первое, что нужно понять, это то, что в своем текущем формате data
очень плохое представление. Это набор строк, объединенных в один список.
Первое, что нужно сделать, если вы сами контролируете, как формируются данные, - это не подготовить их таким образом.
Цель - список для каждого столбца, и в идеале, подготовить список в этом формате.
Однако теперь, если он задан в этом формате, вам нужно выполнить итерацию и собрать значения соответствующим образом. Вот способ сделать это
column_names = ["name", "height" , "weight", "grade"] # Actual list has 10 entries
row_names = ["jack", "mick"]
data = [100, 50,'A', 107, 62,'B'] # The actual list has 1640 entries
dic = {key:[] for key in column_names}
dic['name'] = row_names
print(dic)
Вывод на данный момент:
{'height': [],
'weight': [],
'grade': [],
'name': ['jack', 'mick']} #so, now, names are a column representation with all correct values.
remaining_cols = column_names[1:]
#Explanations for the following part given at the end
data_it = iter(data)
for row in zip(*([data_it] * len(remaining_cols))):
for i, val in enumerate(row):
dic[remaining_cols[i]].append(val)
print(dic)
Вывод:
{'name': ['jack', 'mick'],
'height': [100, 107],
'weight': [50, 62],
'grade': ['A', 'B']}
И мы закончили с представлением
[ 1135] Наконец:
import pd
df = pd.DataFrame(dic, columns = column_names)
print(df)
name height weight grade
0 jack 100 50 A
1 mick 107 62 B
Редактировать: Некоторое объяснение части почтового индекса: zip
берет любые итерации и позволяет нам проходить через них вместе.
data_it = iter(data) #prepares an iterator.
[data_it] * len(remaining_cols) #creates references to the same iterator
Здесь это похоже на [data_it, data_it, data_it]
*
в *[data_it, data_it, data_it]
позволяет нам вместо этого распаковать список в 3 аргумента для функции zip, поэтому f(*[data_it, data_it, data_it])
эквивалентно на f(data_it, data_it, data_it)
для любой функции е.
магия здесь в том, что прохождение через итератор / продвижение итератора теперь будет отражать изменения во всех ссылках
Собрав все это вместе: zip(*([data_it] * len(remaining_cols)))
фактически позволит нам взять 3 элемента из данных за один раз. время, и присвоить его строке Итак, row = (100, 50, 'A')
в первой итерации zip
for i, val in enumerate(row): #just iterate through the row, keeping index too using enumerate
dic[remaining_cols[i]].append(val) #use indexes to access the correct list in the dictionary
Надеюсь, что помогает.