将 datetime.datetime 对象作为键写入 csv 字典

Writing to csv a dictionary with datetime.datetime object as keys

我有一个字典,其中包含 datetime.datetime 个对象作为键,我想将它们写入一个 csv 文件。但是,抛出以下错误:

Traceback (most recent call last):
  File "/Users/macbook/Documents/08_PYTHON/00_PROJECTS/Navps/code/scrape.py", line 179, in <module>
    writer.writerow(data)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/csv.py", line 154, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/csv.py", line 147, in _dict_to_list
    wrong_fields = rowdict.keys() - self.fieldnames
AttributeError: 'datetime.datetime' object has no attribute 'keys'

下面是我的代码:

csv_columns = ['Date','Fund Value']
try:
    with open(bof, 'w') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
        writer.writeheader()
        for data in csvdict:
            writer.writerow(data)
except IOError:
    print("I/O error")

这是 csvdict 的样子:

csvdict = {datetime.datetime(2019, 1, 16, 0, 0): '2.8010', datetime.datetime(2019, 2, 8, 0, 0): '2.8295', datetime.datetime(2019, 2, 7, 0, 0): '2.8326',....}

在将 datetime.datetime 对象作为键处理时,我是否遗漏了什么?我真的很想把日期作为我的钥匙。这根本不可能吗?

注意:如果有帮助,我 运行 就是 Python 3.8

上的这个脚本

DictWriter 用于编写字典列表:

包含完全相同的键。

您可以使用普通的 csv 编写器:

import datetime
import csv

bof = "somefile.csv"
csvdict = {datetime.datetime(2019, 1, 16, 0, 0): '2.8010', 
           datetime.datetime(2019, 2, 8, 0, 0): '2.8295',
           datetime.datetime(2019, 2, 7, 0, 0): '2.8326'}
csv_columns = ['Date','Fund Value']
try:
    with open(bof, 'w') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(csv_columns)
        for key, value in csvdict.items():
            writer.writerow([key, value])
except IOError:
    print("I/O error") 

输出:

Date,Fund Value
2019-01-16 00:00:00,2.8010
2019-02-08 00:00:00,2.8295
2019-02-07 00:00:00,2.8326

您似乎误解了 DictWriter 的工作原理; example 说你会写完整的字典,例如

writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})

你拥有的是一个很大的键值字典。最好使用普通的 csv.Writer:

csv_columns = ['Date','Fund Value']
with open(bof, 'w') as csvfile:
    writer = csv.Writer(csvfile)
    writer.writerow(csv_columns)
    for date, value in csvdict.items():
        writer.writerow([date.isoformat(), value])

我已经为您选择了 ISO-8601 作为日期格式,because it's the only right thing to do ;-)

问题是 csv.DictWriter 希望每一行都是一个字典。因此,要使用它,您需要将 csvdict 中的键值对项转换为行。使用内置 zip() 函数很容易:

import csv
import datetime


bof = 'bof.csv'
csvdict = {datetime.datetime(2019, 1, 16, 0, 0): '2.8010',
           datetime.datetime(2019, 2, 8, 0, 0): '2.8295',
           datetime.datetime(2019, 2, 7, 0, 0): '2.8326',}

csv_columns = ['Date','Fund Value']
try:
    with open(bof, 'w', newline='') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
        writer.writeheader()
        for row in (dict(zip(csv_columns, item)) for item in csvdict.items()):
            writer.writerow(row)
except IOError:
    print("I/O error")