Добавление строк в CSV с использованием Dataframe

Мне нужно добавить новые строки в CSV (если он существует) из фрейма данных. Для этого я считываю файл в фрейм данных и использую pd.concat для объединения нового фрейма данных, затем удаляю все дубликаты, сортирую его по дате и, наконец, записываю в файл. У меня проблема с сохранением в правильном формате.

Мои исходные данные похожи

datetime,symbol,open,high,low,close,volume
2023-08-01 09:15:00,XYZ,2550.25,2559.0,2538.05,2542.15,413767.0      
2023-08-01 09:30:00,XYZ,2542.75,2544.5,2532.05,2536.35,261710.0      
2023-08-01 09:45:00,XYZ,2536.25,2540.65,2536.15,2538.0,135671.0      
2023-08-01 10:00:00,XYZ,2538.15,2538.3,2535.0,2536.75,96318.0        
2023-08-01 10:15:00,XYZ,2536.6,2538.9,2529.1,2532.05,177226.0        
2023-08-01 10:30:00,XYZ,2532.7,2534.0,2525.0,2527.3,221328.0

У меня есть этот код для сохранения кадра данных, когда файл не существует.

path = str(f"{filename}.csv")
csv = Path(path)

if csv.exists():

    df = pd.read_csv(path)
    df = pd.concat([df, df1])
    df = df.drop_duplicates()
    df = df.sort_values(by=['datetime'], ascending=True)
    df.to_csv(path)

else:
    df1 = df1.sort_values(by=['datetime'],ascending=True)
    df1.to_csv(path)

Но когда я пишу в csv после объединения двух фреймов данных, к старым данным добавляется новый столбец (читается из csv), а новые данные без индекса и сортировки также не выполняются.

,datetime,symbol,open,high,low,close,volume
0,2023-08-01 09:15:00,XYZ,2550.25,2559.0,2538.05,2542.15,413767.0
1,2023-08-01 09:30:00,XYZ,2542.75,2544.5,2532.05,2536.35,261710.0
2,2023-08-01 09:45:00,XYZ,2536.25,2540.65,2536.15,2538.0,135671.0
3,2023-08-01 10:00:00,XYZ,2538.15,2538.3,2535.0,2536.75,96318.0
.
.
.
2024-05-23 09:15:00,,XYZ,2919.0,2937.0,2910.0,2931.1,327859.0
2024-05-23 09:30:00,,XYZ,2930.95,2942.5,2930.1,2938.9,328784.0
2024-05-23 09:45:00,,XYZ,2938.85,2940.9,2935.4,2939.1,165822.0
2024-05-23 10:00:00,,XYZ,2939.35,2939.5,2932.15,2935.7,87516.0

Я попробовал index_col=0 в read_csv, но при этом сортировка выдает ошибку.

TypeError: '<' not supported between instances of 'Timestamp' and 'str'

Как обновить CSV в исходном формате?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вам здесь не хватает index=False, что вызывает основную проблему при сохранении CSV. Так что должно быть так-

import pandas as pd
from pathlib import Path

path = str(f"{filename}.csv")
csv = Path(path)

if csv.exists():
    df = pd.read_csv(path, parse_dates=['datetime'])
    df = pd.concat([df, df1])
    df = df.drop_duplicates(subset=['datetime', 'symbol'])
    df = df.sort_values(by='datetime', ascending=True)
    df.to_csv(path, index=False)
else:
    df1 = df1.sort_values(by='datetime', ascending=True)
    df1.to_csv(path, index=False)

Если я добавлю index=False в часть else, столбец datetime не будет сохранен в CSV.

frek 07.06.2024 17:50

можешь добавить тогда вот так - df1.to_csv(path, index=False, date_format='%Y-%m-%d %H:%M:%S') ?

A l w a y s S u n n y 07.06.2024 17:56

В первый раз он записывает данные как есть, без каких-либо новых индексов, таких как 0,1,2. вот когда обновляюсь после прочтения существующего, то вроде бы проблема.

frek 07.06.2024 18:06

добавление parse_dates=['datetime'] и index_col=0 во время чтения CSV помогло. Большое спасибо за помощь.

frek 07.06.2024 18:44

Другие вопросы по теме