Есть ли лучшее решение Pandas, которое позволяет точно идентифицировать типы данных или ближе к тому, что я использую?

#python #pandas #selenium #psycopg2 #tableau-desktop

Вопрос:

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

  • Подробная информация о цели

Я пытаюсь создать сценарий, который экспортирует определенные файлы, а затем импортирует их в базу данных Postgres, чтобы я подключался и использовал информацию в таблице.

Ожидаемые результаты: Каждый час скрипт будет запускаться и загружать csv-файлы из определенных областей и импортировать эти данные в базу данных Postgres в соответствующем формате.

Фактические результаты: Каждый час скрипт запускается и загружает файлы .csv без проблем; однако я замечаю, что в pgAdmin есть столбцы, которые идентифицируются как «Реальные», и когда они отображаются с .00 в таблице, когда я подключаюсь к базе данных Postgres. т. е.: Почтовый индекс 12344.00 и т.д.

Я не получаю никаких сообщений об ошибках, потому что я считаю, что именно эта часть моего сценария вызывает проблему

 for i in os.listdir('csvs'):  if not os.path.splitext(i)[1].endswith(".csv"):  continue  table_name = os.path.splitext(i)[0].replace(' ','')  print(table_name   " table has been created.")  cols = None  with open(os.path.join('csvs', i), encoding="utf-8-sig") as csvFile:  reader = csv.reader(csvFile)  columns = next(reader)  csv_cols = []  for j in columns:  if '"' in j:  j = j.replace('"','')  j = f"{j}"  csv_cols.append(j)  cursor.execute(f"DROP TABLE {table_name}") # If the table exists it will drop and readd the table with the new data  cursor.execute(f"CREATE TABLE {table_name}();")  # with open(os.path.join('csvs', i), encoding="utf-8-sig") as csvFile:  # reader = csv.reader(csvFile)  # cols = next(reader)  csvFile = os.path.join('csvs', i)  df = pd.read_csv(csvFile)  column_list = list(df.columns)  q = f"ALTER TABLE {table_name} ADD COLUMN "  query = q   "%s;"  for j in range(len(column_list)):  column_name = column_list[j]  cn = column_name  if '"' in cn:  cn = cn.replace('"','')  cn = f""{cn}""  print(df[column_list].dtypes[j].name)  if df[column_list].dtypes[j].name.startswith('object'):  datatype = 'varchar'  elif df[column_list].dtypes[j].name.startswith('float'):  datatype = 'real'  elif df[column_list].dtypes[j].name.startswith('int'):  datatype = 'int'  elif df[column_list].dtypes[j].name.startswith('bool'):  datatype = 'boolean'  elif df[column_list].dtypes[j].name.startswith('datetime'):  datatype = 'date'  else:  print(df[column_list].dtypes[j])  column = f"{cn} {datatype}"  query = q column  cursor.execute(query)  # cursor.execute(query, (psycopg2.extensions.AsIs(column),))  

Причина, по которой я использовал приведенный выше код из учебника по панд, заключалась в том, что описание звучало так, как будто это было бы правильным решением. Первоначальная проблема, с которой я столкнулся, заключалась в том, что все отображалось как строка, мне нужен был способ попытаться преобразовать их в правильный тип данных, поэтому я попытался заставить панд прочитать csv и попытаться определить правильный тип данных.

Я сильно опирался на документацию pandas, чтобы попытаться достичь своей цели.

В графическом интерфейсе pgAdmin4 он показывает такие вещи, как почтовый индекс, как «реальный», и добавляет .00, он делает это с множеством других столбцов, таких как идентификатор пользователя и т. Д.

Комментарии:

1. вам может потребоваться другой метод для определения типа данных в CSV/pandas. Возможно, вам придется запустить собственный код для преобразования строк в число и сначала проверить, можно ли их преобразовать в целое число.

2. это может быть проще в использовании for column_name in df.columns: и последующем использовании dtype (без s ) — df[column_name].dtype.name.