МОЕ ТРЕБОВАНИЕ - ИМЕТЬ ВЫВОД пользовательских функций open_duration(open_time): ИЛИ res_duration(res_time): в новом КОЛОННЕ ['Open Resolve Duration'] в selected_columns_df
import pandas as pdpd.options.mode.copy_on_write = True
def calculate_totduration(sr_creation, sr_resolved):
start_date = pd.to_datetime(sr_creation) end_date = pd.to_datetime(sr_resolved)
total_minutes = difference.total_seconds()/60 return total_minutes
def open_duration(open_time):
print(type(open_time)) #sr_open_time = open_time.astype(int)
sr_open_time = pd.to_numeric(open_time)
if sr_open_time <=240:
return('Open < 4 hours')
elif sr_open_time <=480:
return('Open from 4 hrs to 8 hrs')
elif sr_open_time <=720:
return('Open from 8 hrs to 12 hrs')
elif sr_open_time <=1440:
return('Open 12 hrs to 24 hrs')
elif sr_open_time <=2880:
return('Open 24 to 48 hrs')
else: return('OPEN > 48 hrs')
def res_duration(res_time):
sr_res_time = pd.to_numeric(res_time)
if sr_res_time <= 240:
return('Within 4 hours')
elif sr_res_time <=480:
return('Bet 4 hrs to 8 hrs')
elif sr_res_time <=720:
return('8 hrs to 12 hrs')
elif sr_res_time <=1440:
return('12 hrs to 24 hrs')
else:
return('> 24 hrs')
df = pd.read_csv('C:\\Users\\XXXXXX\\Desktop\\PythonCodes\\Testing10.csv',sep=',',skiprows=0,low_memory=False,encoding='utf-8')
filtered_df = df[(df['Region/Circle']=='IND')]
selected_columns_df = filtered_df[['Product','Customer Name','SI Number','SI Name','SR Number','SR Status','Region/Circle','Case Type','Source','SR Creation Time','Resolved Time','Total Duration SUM','Case Type','Ser Segment']]
selected_columns_df['Total Minutes'] = selected_columns_df.apply(lambda row:calculate_totduration(row['SR Creation Time'],row['Resolved Time']),axis=1)
if selected_columns_df['SR Status'].str.lower == 'open' or selected_columns_df['SR Status'].str.lower == 're-open':
selected_columns_df['Open Resolve Duration'] = selected_columns_df.apply(lambda row:open_duration(calculate_totduration(row['SR Creation Time'],pd.to_datetime('today'))),axis=1)
else:
selected_columns_df['Open Resolve Duration'] = selected_columns_df.apply(lambda row :res_duration(row['Total Minutes']))
#selected_columns_df['Open Resolve Duration'] = selected_columns_df.apply(lambda row :res_duration(lambda row :calculate_totduration(row['SR Creation Time'],row['Resolved Time'])))
selected_columns_df.to_csv('MYoutfile4.csv')
print('FILE WRITTEN')
print(pd.to_datetime('today'))
Но я получаю следующую ошибку:
Файл «C:\Users\xXXXXXx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\core\indexes\base.py», строка 3805, в get_loc вернуть self._engine.get_loc(casted_key) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл «index.pyx», строка 167, в pandas._libs.index.IndexEngine.get_loc Файл «index.pyx», строка 175, в pandas._libs.index.IndexEngine.get_loc Файл «pandas\_libs\index_class_helper.pxi», строка 70, в pandas._libs.index.Int64Engine._check_type KeyError: «Всего минут»
Вышеупомянутое исключение было непосредственной причиной следующего исключения:
Traceback (последний вызов последний):
Файл «c:\Users\xXXXXXx\Desktop\PythonCodes\DATASETS.py», строка 71, в
selected_columns_df['Open Resolve Duration'] = selected_columns_df.apply(лямбда-строка:res_duration(строка['Всего минут']))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
Файл «C:\Users\xXXXXXx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\core\frame.py», строка 10374, в приложении.
вернуть op.apply().finalize(self, метод="apply")
^^^^^^^^^^
Файл «C:\Users\xXXXXXx\AppData\Local\Programs\Python\Python312\Lib\site-your textpackages\pandas\core\apply.py», строка 916, в приложении.
вернуть self.apply_standard()
^^^^^^^^^^^^^^^^^^^^^^
Файл «C:\Users\xXXXXXx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\core\apply.py», строка 1063, в apply_standard
результаты, res_index = self.apply_series_generator()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Файл «C:\Users\xXXXXXx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\core\apply.py», строка 1081, в apply_series_generator
результаты[i] = self.func(v, *self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Файл «c:\Users\xXXXXXx\Desktop\PythonCodes\DATASETS.py», строка 71, в
selected_columns_df['Open Resolve Duration'] = selected_columns_df.apply(лямбда-строка:res_duration(строка['Всего минут']))
~~~^^^^^^^^^^^^^^^^^
Файл «C:\Users\xXXXXXx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\core\series.py», строка 1121, в getitem вернуть self._get_value(ключ) ^^^^^^^^^^^^^^^^^^^^^ Файл «C:\Users\xXXXXXx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\core\series.py», строка 1237, в _get_value loc = self.index.get_loc(метка) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл «C:\Users\xXXXXXx\AppData\Local\Programs\Python\Python312\Lib\site-packages\pandas\core\indexes\base.py», строка 3812, в get_loc поднять KeyError(ключ) из ошибки KeyError: «Всего минут»






Вы забыли добавить axis=1.
Заменять:
selected_columns_df['Open Resolve Duration'] = selected_columns_df.apply(lambda row :res_duration(row['Total Minutes']))
С:
selected_columns_df['Open Resolve Duration'] = selected_columns_df.apply(lambda row :res_duration(row['Total Minutes']), axis=1)
Спасибо, это сработало, но обнаружена еще одна проблема, и нужна помощь: оператор if ниже возвращает false, даже если он содержит строку «open» или «re-open», if selected_columns_df['SR Status'].str.lower == 'open ' или selected_columns_df['SR Status'].str.lower == 'повторно открыть':
Используйте if selected_columns_df['SR Status'].str.lower() == 'open' or selected_columns_df['SR Status'].str.lower() == 're-open'. Но, кстати, если у вас есть еще вопрос, вам придется задать еще один вопрос. Если это сработало, пожалуйста, примите и проголосуйте.
@Jaffer Пожалуйста, прочитайте выше.
надо исправить отступ....