python pandas ValueError: длина значений не соответствует длине индекса - PullRequest
0 голосов
/ 03 октября 2018

Цель этого кода - очистить несколько таблиц данных различной длины (разное количество строк в таблице), превратить их в фреймы данных pandas, удалить некоторые ненужные столбцы и исправить дату.

Все вышеперечисленное работает нормально, за исключением исправления даты.

Я попытался полностью восстановить дату, создав новый столбец с восстановленной датой.

Но когда я попробовал этот код:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import pandas as pd
from datetime import datetime
from tzlocal import get_localzone

class DataEngine:
    def __init__(self):
        self.urls = open(r"C:\Users\Sayed\Desktop\script\sample.txt").readlines()
        self.driver = webdriver.Chrome(r"D:\Projects\Tutorial\Driver\chromedriver.exe")
        self.wait = WebDriverWait(self.driver, 10)

    def title(self):
        names = []
        for url in self.urls:
            self.driver.get(url)
            title = self.driver.find_element_by_xpath('//*[@id="leftColumn"]/h1').text
            names.append(title)
        return names

    def table(self):
        DataFrames = []
        for url in self.urls:
            self.driver.get(url)
            while True:
                try:
                    item = self.wait.until(
                        ec.visibility_of_element_located((By.XPATH, '//*[contains(@id,"showMoreHistory")]/a')))
                    self.driver.execute_script("arguments[0].click();", item)
                except Exception:
                    break

            df = pd.DataFrame(columns=['Release Date', 'Time', 'Actual', 'Forecast', 'Previous'])
            pos = 0
            for table in self.wait.until(
                    ec.visibility_of_all_elements_located((By.XPATH, '//*[contains(@id,"eventHistoryTable")]//tr'))):
                data = [item.text for item in table.find_elements_by_xpath(".//*[self::td]")]
                if data:
                    df.loc[pos] = data[0:5]
                    pos += 1
            df = df.head(50)
            DataFrames.append(df)
        return DataFrames

    def date(self):
        Dates = []
        dfs = []
        tables = self.table()
        for df in tables:
            df["Date"] = df["Release Date"].apply(lambda date: date[:12]) + " " + df["Time"]
            for date in df["Date"]:
                date = datetime.strptime(date.strip(), '%b %d, %Y %H:%M')
                Dates.append(date)
            df["Date"] = Dates
            df['Date'] = df['Date'].dt.tz_localize('EST').dt.tz_convert(get_localzone())


            df = df[['Date', 'Actual', 'Forecast', 'Previous', 'Release Date', 'Time']]
            df = df.drop(df.columns[-4:], axis=1).reset_index(drop=True)
            print(df.head())

            dfs.append(df)
        return dfs 

Я получил эту ошибку:

Трассировка (последний последний вызов):

Файл "D: /Projects/Tutorial/database.py", строка 94, в DataEngine (). date ()

Файл "D: /Projects/Tutorial/database.py", строка 57, в дате df ["Date"] = Даты

Файл "C: \ Users \ Sayed \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py ", строка 3119, в setitem

self._set_item(key, value)

Файл" C: \ Users\ Sayed \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py ", строка 3194, в _set_item

value = self._sanitize_column(key, value)

Файл" C: \ Users \ Sayed \ Anaconda3 \ lib \ site-packages "\ панды \ ядро ​​\ Frame.py ", строка 3391, в _sanitize_column

value = _sanitize_index(value, self.index, copy=False)

Файл" C: \ Users \ Sayed \ Anaconda3 \ lib \ site-packages \ pandas \ core \ series.py ", строка 4001, в _sanitize_index

raise ValueError('Length of values does not match length of ' 'index')

ValueError: длина значений не соответствует длине индекса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...