Próbuję przekonwertować niektóre kolumny na format daty, ale nie mam szczęścia. Oto mój kod:

from datetime import date, datetime
from utils import misc_errors
from os import listdir, remove
from os.path import isfile, join
from pathlib import Path
import pandas as pd
import shutil
import csv
import io
import codecs

# getting paths that will be used later
path = str(Path().absolute()) + r'\\'
files = []
fetch = r'C:\'  +'\\'  
net = r'C:\' +'\\'

# getting the names of the files needed to copy
allfiles = [f for f in listdir(fetch) if isfile(join(fetch, f))]
for name in allfiles:
    if name.endswith('csv'):
        files.append(name) 
for file_name in files:

    #copy the file
    shutil.copy2(fetch + file_name, path + file_name)

    #get the date for later
    file_date = date.today().strftime("%Y%m%d")

    # Reading the data from the csv file
    #file_df = pd.read_csv(file_name, sep=',', quotechar='"', thousands=',', encoding='Latin-1')
    file_df = pd.read_csv(file_name, sep=',',delimiter=',', quotechar='"', thousands=',', encoding='Latin-1', dtype='object', low_memory=False, skiprows=5)
    file_df.columns = [col.strip() for col in file_df.columns]

    #populate the count column
    total = len(file_df.index)
    count = []
    for i in range(0, total):
        count.append('1')        
    file_df["count()"] = count

    # get a list of the headers for use later
    headers = file_df.columns.values.tolist()

    file_df.fillna('',inplace=True)

    if 'project' in file_name:
        # remove all duplicates from the projects file
        file_df = file_df.drop_duplicates(keep='first')

        file_final = "PROJECTS.FULL." + file_date
        supplier = []
        for i in range(0, total):
            supplier.append('Unclassified')

        file_df["Suppliers - ERP Supplier ID"] = supplier
        file_df["Suppliers - ERP Supplier"] = supplier

        file_df = file_df.apply(lambda x: pd.Series([str(x[i]).replace("\n",'') for i in range(0, len(x))], index=headers), axis=1)

        num_headers = [r"sum(Annual Spend Amount)", r"sum(Total Contract Value Amount)"]
        for header in num_headers:
            file_df[header] = ['{0:.0f}'.format(float(file_df[header][i])) if file_df[header][i] == 0 else '{0:,.2f}'.format(float(file_df[header][i])) if file_df[header][i] != '' else '' for i in range(0,len(file_df[header]))]

        header = r"sum(% of Total Contract Value in US)"
        file_df[header] = [int(float(file_df[header][i])) if file_df[header][i] != '' else '' for i in range(0, len(file_df[header]))]

        header = "Reporting Year"
        file_df[header] = [int(float(file_df[header][i])) if file_df[header][i] != '' else '' for i in range(0, len(file_df[header]))]

        word_headers = ["Description", "Key Considerations", "Key Highlights / Value Statement", "Status Update"]
        for header in word_headers:
            file_df = misc_errors(file_df, header)

        file_df.columns = [c.replace("–", "-") for c in file_df]

        file_headers = ["Begin Date","End Date - Date","Estimated Completion Date - Date",
        "Anticipated T&O Legal Engagement Date - Date","Benefits Start Date - Date", "Benefits End Date - Date" ]

        pd.to_datetime(file_headers['Begin Date'], errors='ignore')

        file_df.to_csv(file_final, index=False, encoding="latin-1")

        remove(file_name)

        shutil.copy2(path + file_final, net + file_final)

Próbuję przekonwertować kolumny w file_header (u dołu) na bieżąco,

Zaktualizowano i dodałem pełny dziennik błędów tutaj:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-f04094ba593a> in <module>
     79         "Anticipated T&O Legal Engagement Date - Date","Benefits Start Date - Date", "Benefits End Date - Date" ]
     80 
---> 81         pd.to_datetime(file_headers['Begin Date'], errors='ignore')
     82 
     83         file_df.to_csv(file_final, index=False, encoding="latin-1")

TypeError: list indices must be integers or slices, not str 

Jednak nadal nie działa. Dziękuję za wszelką dotychczasową pomoc i daj mi znać, jeśli mogę jeszcze coś tutaj zrobić.

0
JJ13596 20 listopad 2019, 19:23
Opublikuj pełny dziennik błędów. Debugowanie za pomocą samego komunikatu o błędzie jest tak mylące.
 – 
Poojan
20 listopad 2019, 19:30
Spróbuj użyć: pd.to_datetime (df ['Date'], errors = 'coerce') lub pd.to_datetime (df ['Date'], errors = 'ignore'), wygląda na to, że masz wartości, których nie można zostanie przekształcona na datetime, "errors = 'coerce'" zamieni te wartości na NaN, a "errors = 'ignore'" "simple zignoruje te wartości.
 – 
Carp-Bezverhnii Maxim
20 listopad 2019, 19:40
Patrząc na błąd, wygląda na to, że Twój typ df został zmieniony z dataframe na list.
 – 
Rahul Raut
20 listopad 2019, 19:44
Zredagowałem moje pytanie, uruchomiłem skrypt z pd.to_datetime (df ['Date'], errors = 'ignore') i załączyłem pełny dziennik błędów
 – 
JJ13596
20 listopad 2019, 20:00

1 odpowiedź

Możesz sprawdzić zawartość swojej kolumny Date. Spróbuj obejść to w pętli i znajdź niedziałające wartości:

for row in df.itertuples():
    try:
        pd.to_datetime(row.Date)
    except:
        print(row.Date)

Następnie pomyśl, co chcesz z nimi zrobić

0
Baudouin Théobald 20 listopad 2019, 19:43