Nybörjare behöver hjälp med Python error.

Permalänk

Nybörjare behöver hjälp med Python error.

Hejsan, kört fast på jobbet. Inte riktigt arbetat med Python förut och fick detta problem. Något typ av datumstrul? Det är också en path.join mellan den och en annan, långa kolumner med datum och klockslag.

Tänker att det kanske är ett helt uppenbart fel för någon med erfarenhet. Uppskattar rejält eventuell hjälp.

https://imgur.com/a/Up7WPw

Mvh
Jonas

Bildlänk verkar inte fungera.
Permalänk
Medlem

Formatet för tid stämmer inte? Angivet '%Y-%m-%d %H:%M:%S', men den får '%Y-%m-%d %H-%M-%S'

Visa signatur

+++ Divide By Cucumber Error. Please Reinstall Universe And Reboot +++

"Real stupidity beats artificial intelligence every time." - Terry Pratchett, Hogfather

Permalänk
Medlem

Svårt när man inte har hela datan men du verkar köra ner till minuter på ena tidsformatet och ner till sekunder på den andra.

Permalänk
Hedersmedlem

Datumformatet i filen(?) du läser in har tiden angiven som 09-30-00 medan formatet som används (%H:%M) vill ha det som 09:30:00 istället.

Är alla datum i filen på exakta 15-minuters-intervall så är det nog fel i formatet på raden ovan? Den skulle ersätta 09-00-30 till 09:00:30 men inte 09-30-00 till 09:30:00, om det inte är en jättelång rad vi inte kan se här.
Men om alla datum+tiden i filen är i samma format så är det nog bättre att köra enbart rad #2 med rätt input-format direkt (gissningsvis: "%Y-%m-%d %H-%M-%S"), istället för att köra search/replace i texten.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Du har bindestreck istället för kolon i tiden.

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk

Underlaget har -##-## i formatet men filen som den formaterar om till har :##:##. Filen används sedan som ett underlag för en Power Bi rapport.

Allt fungerade fram till att vi la in till serier som får kvartsupplösta värden.

Permalänk
Medlem
Skrivet av PythonChoklad:

Underlaget har -##-## i formatet men filen som den formaterar om till har :##:##. Filen används sedan som ett underlag för en Power Bi rapport.

Allt fungerade fram till att vi la in till serier som får kvartsupplösta värden.

Var det då ni la in en radda med .replace?

Kopiera in kodsnutten mellan kodtaggar.

[code] Skriv koden här [/code]

Permalänk
Skrivet av Chibariku:

Var det då ni la in en radda med .replace?

Kopiera in kodsnutten mellan kodtaggar.

[code] Skriv koden här [/code]

[code]

Permalänk

Kommer från den csv som refereras till i början vid: mdm_csv_path = os.path.join(

*[MDM_EXPORT_PATH, 'Multiplier och Meter Factor AMM2G kat 2-5.csv']

Okej det var inte vidare lättläst. ber om ursäkt. Tror det blir fel med format via koden jag sparat på mail.

Permalänk
Hedersmedlem

Replace-koden är ju dock fel som jag nämnde förut, den skriver om när sekunderna är 15, 30 eller 45, men inte när minuterna är det.
Det känns inte som en bra lösning, men det bör fungera om du bara fixar till den raden.

Från:

df_mdm['Startdatum MDM'] = df_mdm['Startdatum MDM'].str.replace('-00-00', ':00:00').replace('-00-15', ':00:15').replace('-00-30', ':00:30').replace('-00-45', ':00:45')

Till:

df_mdm['Startdatum MDM'] = df_mdm['Startdatum MDM'].str.replace('-00-00', ':00:00').replace('-15-00', ':15:00').replace('-30-00', ':30:00').replace('-45-00', ':45:00')

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem
Skrivet av PythonChoklad:

constant_control(): mdm_csv_path = os.path.join( *[MDM_EXPORT_PATH, 'Multiplier och Meter Factor AMM2G kat 2-5.csv']) wms_xlsx_path = os.path.join( *[POWER_BI_PATH, 'Excel', 'Konstantkontroll AMM2G.xlsx']) import win32com.client excel_path = os.path.join( *[POWER_BI_PATH, 'Excel', 'sharepoint_fetch_macro.xlsm']) xl = win32com.client.Dispatch("Excel.Application") print('-' * 30 + ' COPYING Konstantkontroll FROM SHAREPOINT ' + '-' * 30) print(f'Opening Excel file...') xl.Workbooks.Open(os.path.abspath(excel_path), ReadOnly=1) print(f'Executing macro fetchWMSConstantReport()...') xl.Application.Run(f"fetchWMSConstantReport") print(f'Konstantkontroll-file has been copied from Sharepoint.') df_mdm = pd.read_csv( mdm_csv_path, encoding='unicode_escape', sep=';', dtype=str) df_wms = pd.read_excel(wms_xlsx_path) # df_mdm processing df_mdm.columns = [x.lstrip() for x in df_mdm.columns] df_mdm = df_mdm[['Code', 'MeterFactor', 'Multiplier', 'Multiplier connected MP', 'Validity (start) Register Link', 'Category']] df_mdm.drop_duplicates(keep='last', inplace=True) df_mdm['MeterFactor'] = df_mdm['MeterFactor'].astype(float).astype(int) df_mdm['Multiplier'] = df_mdm['Multiplier'].astype(float).astype(int) df_mdm['Multiplier connected MP'] = df_mdm['Multiplier connected MP'].astype( float).astype(int) df_mdm['Code'] = df_mdm['Code'].astype(str) df_mdm.rename(columns={'Code': 'ean_code', 'Validity (start) Register Link': 'Startdatum MDM', 'MeterFactor': 'Meter Factor MDM', 'Multiplier': 'Multiplier MDM', 'Multiplier connected MP': 'Multiplier kopplad mätpunkt MDM', 'Category': 'Kategori'}, inplace=True) df_mdm['Startdatum MDM'] = df_mdm['Startdatum MDM'].str.replace( '-00-00', ':00:00').replace('-00-15', ':00:15').replace('-00-30', ':00:30').replace('-00-45', ':00:45') # har lagt till .replace('-00-15', ':00:15').replace('-00-30', ':00:30').replace('-00-45', ':00:45') för test df_mdm['Startdatum MDM'] = [x.strftime( '%Y-%m-%d %H:%M:%S') for x in pd.to_datetime(df_mdm['Startdatum MDM'], format='%Y-%m-%d %H:%M:%S')] #det är den här raden som får felmeddelandet nedan. # lägger till :%S i strftime för att få den på samma format # df_wms processing df_wms.columns = [x.lower() for x in df_wms.columns] df_wms = df_wms[['debit_constant', 'konstant_startdatum', 'ean_code', 'meterno']] df_wms.drop_duplicates(keep='last', inplace=True) df_wms['debit_constant'] = df_wms['debit_constant'].astype( float).astype(int) df_wms['ean_code'] = df_wms['ean_code'].astype(str) df_wms.rename(columns={'konstant_startdatum': 'Startdatum WMS', 'meterno': 'Mätarnummer', 'debit_constant': 'Konstant WMS'}, inplace=True) df_wms['Startdatum WMS'] = [x.strftime( '%Y-%m-%d %H:%M') for x in pd.to_datetime(df_wms['Startdatum WMS'], format='%Y-%m-%d %H:%M:%S')] # Merge MDM and WMS df_tot = df_mdm.merge(df_wms, on='ean_code') df_tot.rename(columns={'ean_code': 'Anläggning'}, inplace=True) # Filter on mismatch criteria mask_mdm_wms_mismatch = df_tot['Multiplier MDM'] != df_tot['Konstant WMS'] mask_cons_prod_mismatch = (df_tot['Multiplier kopplad mätpunkt MDM'] != df_tot['Multiplier MDM']) & ( df_tot['Multiplier kopplad mätpunkt MDM'] > 0) df_mismatch = df_tot.loc[mask_mdm_wms_mismatch | mask_cons_prod_mismatch].drop_duplicates(keep='last') df_mismatch['Multiplier kopplad mätpunkt MDM'].loc[df_mismatch['Multiplier kopplad mätpunkt MDM'] == 0] = 'N/A' # Add validation description column df_mismatch['Validering'] = '' df_mismatch['Validering'].loc[mask_cons_prod_mismatch] = 'Multiplier stämmer ej mellan kons och prod' df_mismatch['Validering'].loc[mask_mdm_wms_mismatch] = 'Konstant-mismatch mellan WMS och MDM' print(df_mismatch) df_mismatch.to_csv(os.path.join( *[POWER_BI_PATH, 'csv', 'constant_mismatch.csv']), index=False)

Skrivet av PythonChoklad:

File "C:\Skript Power BI\data_processer_powerbi.py", line 1271, in constant_control '%Y-%m-%d %H:%M:%S') for x in pd.to_datetime(df_mdm['Startdatum MDM'], format='%Y-%m-%d %H:%M:%S')] File "C:\Skript Power BI\data_processer_powerbi.py", line 1818, in init_schedule schedule.run_all() File "C:\Skript Power BI\data_processer_powerbi.py", line 1862, in main init_schedule() File "C:\Skript Power BI\data_processer_powerbi.py", line 1866, in <module> main() ValueError: time data "2023-08-11 09-30-00" at position 185242 doesn't match format specified

Det är line 1271 felet som är det som gör att det inte funkar, de andra 4 har varit där sen start. Oklart varför de är ett problem men så länge scriptet kör har jag inte haft tid att lägga energi på det.

Exempel på strukturen där datumen verkar fela:

Validity (start) Register Link

2022-06-15 01-00-00

Kommer från den csv som refereras till i början vid: mdm_csv_path = os.path.join(

*[MDM_EXPORT_PATH, 'Multiplier och Meter Factor AMM2G kat 2-5.csv']

Okej det var inte vidare lättläst. ber om ursäkt. Tror det blir fel med format via koden jag sparat på mail.

Jag vet inte om den är replace-grejen är rimlig långsiktigt (snarare, den är inte rimlig, men vi får resonera utifrån vad du visar), men den verkar omkastad sett till datumet som skriptet går sönder av, samt att du sätter att tiderna är kvartsvisa.

Dvs borde förmodligen byta ut "-30-00" istf "-00-30"?

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk

Uppskattar svaren men tyvärr samma fel.

Permalänk

Var en exkollegas mosterscript som jag fick över mig så var lite ute och cyklade.

Men allt verkar fungera nu. Tack för all hjälp! Fick lägga allt i var sin rad med str.replace.

Permalänk
Medlem

En säkrare variant

def _fix_datetime_format(dt: str) -> str: assert len(dt) == 19, "Datum har fel längd" yymmdd = dt[:10] hhmmss = dt[11:].replace('-', ':') result = f'{yymmdd} {hhmmss}' return result df_mdm['Startdatum MDM'] = _fix_datetime_format(df_mdm['Startdatum MDM'].str.strip())