Мне нужно добавить новые строки в 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 в исходном формате?






Я думаю, вам здесь не хватает 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)
можешь добавить тогда вот так - df1.to_csv(path, index=False, date_format='%Y-%m-%d %H:%M:%S') ?
В первый раз он записывает данные как есть, без каких-либо новых индексов, таких как 0,1,2. вот когда обновляюсь после прочтения существующего, то вроде бы проблема.
добавление parse_dates=['datetime'] и index_col=0 во время чтения CSV помогло. Большое спасибо за помощь.
Если я добавлю index=False в часть else, столбец datetime не будет сохранен в CSV.