如何在没有逗号分隔分隔符的情况下将日期时间列表附加到 CSV?

问题描述

我可以在这里使用一些帮助。我正在尝试将已转换为列表的日期时间索引附加到现有 CSV 文件中。当我运行代码时,列表确实按预期附加,但时间以逗号分隔,而用于附加数据的列表不是。我的代码在下面

import csv
import numpy as np
import datetime
import pandas as pd

time_Now = datetime.datetime.Now() + datetime.timedelta(minutes = 5)
time_future = time_Now + datetime.timedelta(minutes = 30)
time_predict = pd.date_range(time_Now,time_future,freq = '5min')
time_predict_list = time_predict.strftime("%Y-%m-%d %H:%M:%s").tolist()

overwrite = input("Would You like to Overwrite or Append Prediction Data? Type (a) to Append,Type (o) to Overwrite: ")
if overwrite == "o":
    np.savetxt("time_list.csv",time_predict_list,delimiter =",",fmt ='% s')

def append_list_as_row(file_name,list_of_elem):
    with open(file_name,'a+',newline='') as file:
        csv_writer = csv.writer(file)
        csv_writer.writerows(list_of_elem)

if overwrite != "o":
    append_list_as_row('time_list.csv',time_predict_list)

实际输出

2021-02-08 10:54:31
2021-02-08 10:59:31
2021-02-08 11:04:31
2021-02-08 11:09:31
2021-02-08 11:14:31
2021-02-08 11:19:31
2021-02-08 11:24:31
2,2,1,-,8,:,5,4,1
2,9,1

然后预期的输出将是第 8-14 行中的相同值,但没有用逗号分隔

解决方法

writerows 不正确。它需要一个列表列表。字符串列表看起来像列表列表,因为字符串是可迭代的字符。

使用writerow,但要将每个项目放在单独的行上,每个“行”都需要是该行中项目的列表。在这种情况下,这是单个项目:

for row in list_of_elem:
    csv_writer.writerow([row])

当您可以以所需模式打开文件时,您实际上并不需要 csv 模块。将打开的文件传递给 np.savetext

import datetime
import numpy as np
import pandas as pd

def append_list_as_row(file_name,list_of_elem):
    with open(file_name,'a') as file:
        for row in list_of_elem:
            print(row,file=file)

time_now = datetime.datetime.now() + datetime.timedelta(minutes = 5)
time_future = time_now + datetime.timedelta(minutes = 30)
time_predict = pd.date_range(time_now,time_future,freq = '5min')
time_predict_list = time_predict.strftime("%Y-%m-%d %H:%M:%S").tolist()

overwrite = input("Would You like to Overwrite or Append Prediction Data? Type (a) to Append,Type (o) to Overwrite: ")

with open('time_list.csv','w' if overwrite == 'o' else 'a') as file:
    np.savetxt(file,time_predict_list,fmt='%s')