Я сравниваю две таблицы Excel для сотрудников. Это те же данные, с разницей всего в одну неделю. Затем он выделяет изменения в столбцах заработной платы, если таковые имеются. Код работает, но экспортируемый им лист Excel все еще имеет не тот формат, который мне нужен. В таблице Excel все даты представлены в формате 2023-06-18 00:00:00.
Я хочу создать дату в файле Excel m-d-yyyy. Я попытался преобразовать формат после преобразования столбцов в дату и время, и я попробовал внизу во время процесса экспорта, но, похоже, мне не удалось его изменить. Он продолжает экспортировать Excel с 00:00:00. Это легко изменить в Excel после того, как я его открою, но я хочу, чтобы мне не приходилось изменять конечный продукт Excel.
Я хочу гарантировать, что она останется функцией даты при экспорте в Excel. Я видел много функций преобразования строк, но я почти уверен, что это негативно повлияет на мои столбцы Excel после экспорта.
Кроме того, я не сомневаюсь, что кто-то сможет легко решить эту проблему, но можете ли вы сообщить мне, если обнаружите проблему, которая не позволяет мне изменить формат после преобразования столбцов в дату и время? Я чувствую, что смогу легко это изменить.
import pandas as pd
import datetime as dt
import xlwings
#new_WFRL
new_WFRL = pd.read_excel("H:/DIR/Human Resources/HR Audits/Raw Files/WFRL 6.24.24.xlsx", usecols=["Empl ID", "Name", "Grade", "Step", "Grade Entry Date", "Step Date", "WGI Due Dt"], parse_dates=["Grade Entry Date", "Step Date", "WGI Due Dt"], date_format = "%m/%d/%y", index_col=False).sort_values("Name")
new_WFRL = new_WFRL.add_prefix("New ")
new_WFRL[['New Grade Entry Date', 'New Step Date', 'New WGI Due Dt']] = new_WFRL[['New Grade Entry Date', 'New Step Date', 'New WGI Due Dt']].apply(pd.to_datetime, format='mixed')
#old_WFRL
old_WFRL = pd.read_excel("H:/DIR/Human Resources/HR Audits/Raw Files/WFRL 6.14.24.xlsx", usecols=["Empl ID", "Name", "Grade", "Step", "Grade Entry Date", "Step Date", "WGI Due Dt"], parse_dates=["Grade Entry Date", "Step Date", "WGI Due Dt"], date_format = "%m/%d/%y", index_col=False).sort_values("Name")
old_WFRL = old_WFRL.add_prefix("Old ")
#this converts the specific columns to datetime data types - can confirm with old_WFRL.info()
old_WFRL[['Old Grade Entry Date', 'Old Step Date', 'Old WGI Due Dt']] = old_WFRL[['Old Grade Entry Date', 'Old Step Date', 'Old WGI Due Dt']].apply(pd.to_datetime, format = '%Y-%m-%d %H:%M:%S')
#old_WFRL[['Old Grade Entry Date', 'Old Step Date', 'Old WGI Due Dt']] = old_WFRL[['Old Grade Entry Date', 'Old Step Date', 'Old WGI Due Dt']].apply(lambda x: dt.datetime.strftime(x, '%m-%d-%Y'))
merged_WFRL = pd.merge(old_WFRL, new_WFRL, how = "outer", left_on = "Old Empl ID", right_on = "New Empl ID")
merged_WFRL
#this is the function that will show a change
def compare_WFRL(df):
if df["Old Grade"] == df["New Grade"] and df["Old Step"]== df["New Step"]:
return 1
else:
return 0
#applies the above function
merged_WFRL["changes"] = merged_WFRL.apply(compare_WFRL, axis =1)
#filters all the rows so changes are the only ones left
merged_changes = merged_WFRL[merged_WFRL["changes"] == 0]
merged_changes.pop('changes')
# Export DataFrame to Excel
export_file = "H:/DIR/Human Resources/HR Audits/WFRL Comparison Reports/6.24.24v7.xlsx"
merged_changes.to_excel(export_file, index=False)
######################################################################################################
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
from openpyxl.worksheet.dimensions import ColumnDimension, DimensionHolder
from openpyxl.utils import get_column_letter
from openpyxl.styles import NamedStyle
'''
tried to us xlwings but still having error in coding - taken from SO as a guide. Not all info
has been updated to relate to my info.
with pd.ExcelWriter(export_file, engine='xlwings', date_format = "mm dd yyyy", datetime_format = "mm dd yyyy") as writer:
merged_changes.to_excel(writer, sheet_name='Sheet1', index=False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
formatdict = {'num_format':'mm/dd/yyyy'}
fmt = workbook.add_format(formatdict)
#worksheet.set_column('A:B', 20, fmt)
'''
# Load the workbook and select the active worksheet
wb = load_workbook(export_file)
ws = wb.active
# Define cell styles
yellow_fill = PatternFill(start_color = "FFFF00", end_color = "FFFF00", fill_type = "solid")
red_fill = PatternFill(start_color = "FF0000", end_color = "FF0000", fill_type = "solid")
# Apply conditional formatting
for row in range(2, len(merged_changes) + 2):
old_grade_cell = ws.cell(row=row, column=2) # Old Grade
new_grade_cell = ws.cell(row=row, column=10) # New Grade
old_step_cell = ws.cell(row=row, column=3) # Old Step
new_step_cell = ws.cell(row=row, column=11) # New Step
# Check for New Grade not equal to Old Grade
if new_grade_cell.value != old_grade_cell.value:
new_grade_cell.fill = yellow_fill
# Check for New Step not equal to Old Step
if new_step_cell.value != old_step_cell.value:
new_step_cell.fill = red_fill
# Applys formating to column width
dims = {}
for row in ws.rows:
for cell in row:
if cell.value:
dims[cell.column_letter] = max((dims.get(cell.column_letter, 0), len(str(cell.value))))
for col, value in dims.items():
ws.column_dimensions[col].width = value *1.25 #*1.25 added additional width to the column. The formatting didn't give it enough space, this expanded it further.
# Save the workbook
wb.save(export_file)
вы можете просто использовать аксессор .dt
, чтобы удалить время из объектов datetime
Я просто пробую разные вещи. Я пробовал разные версии, которые не работают, и продолжаю искать другие подходы. Я пытался лучше понять pd.ExcelWriter и то, как он работает. Я взял этот фрагмент кода с другой страницы SO, но мне трудно его реализовать. Вот почему это примечание, а не текущий код, и почему xlwings является движком. Я считаю, что в исходном коде движок указан как xlsxwriter, но anaconda не позволяет мне добавить его на мой компьютер, потому что я государственный служащий, и он хочет, чтобы я получил лицензию. Нужен ли мне двигатель? Все еще изучаю.
@iBeMeltin есть ли у вас ссылка на то, как это будет выглядеть для моего текущего кода? Это .apply(pd.to_datetime, format = xxx).dt?
xlwings
не является допустимым двигателем.
вы можете удалить время из объектов datetime, используя аксессор .dt
:
df = pd.DataFrame({'A': pd.date_range("2018-01-01", periods=3, freq = "h"),
'B': pd.date_range("2018-01-01", periods=3, freq = "h")})
print(df)
A B
0 2018-01-01 00:00:00 2018-01-01 00:00:00
1 2018-01-01 01:00:00 2018-01-01 01:00:00
2 2018-01-01 02:00:00 2018-01-01 02:00:00
cols = ['A', 'B']
df[cols] = df[cols].apply(lambda x: pd.to_datetime(x).dt.date)
print(df)
A B
0 2018-01-01 2018-01-01
1 2018-01-01 2018-01-01
2 2018-01-01 2018-01-01
поэтому для вашего примера:
new_cols = ['New Grade Entry Date', 'New Step Date', 'New WGI Due Dt']
new_WFRL[new_cols] = new_WFRL[new_cols].apply(lambda x: pd.to_datetime(x).dt.date)
old_cols = ['Old Grade Entry Date', 'Old Step Date', 'Old WGI Due Dt']
old_WFRL[old_cols] = old_WFRL[old_cols].apply(lambda x: pd.to_datetime(x).dt.date)
Спасибо - это сработало. Я ценю помощь!
date_format
иdatetime_format
, на которые вы ссылаетесь. Немного непонятно, почему вы пытаетесь использоватьxlwings
в качестве движка.