如何解决使用csv.DictReader
我有一个CSV文件,其中显示了一些基本的被救狗,包括它们何时进入救援以及何时被收养。我最终试图在地图上进行可视化处理,以显示狗从一个区域移动到另一个区域的位置。我要看的元素之一是特定狗在领养之前要养多久。
这是CSV文件的开头。
Name,Status,Sex,Animal_ID,Birthdate,Adopter_City,Adopter_State,Adopter_Zip,Foster_City,Foster_State,Foster_Zip,Created_Date,Adopted_Date,Length
Marnie,Adopted,Female,15598143,2019-03-24,Port Orchard,Wa,98367,Auburn,WA,98002,2020-04-22,2020-07-08
Kendra,15598254,2019-12-31,Austin,Tx,78731,78723,2020-05-01
Hope,15598264,2019-10-25,Springfield,OR,97477,TX,78737,2020-05-02
...
我使用datetime.strptime格式化摄入量(用于寄养)和摄入量(采用)。然后,我计算了住院时间=摄入量-摄入量。该代码正确计算了长度。
import csv
from datetime import datetime
with open('animals_20200826_12p46.csv',newline = '') as csvfile:
data = csv.DictReader(csvfile)
for row in data:
if len(row['Adopted_Date']) < 1 :
continue
intake = datetime.strptime(row['Created_Date'],'%Y-%m-%d')
outtake = datetime.strptime(row['Adopted_Date'],'%Y-%m-%d')
length = outtake - intake
row['Length'] = length
print('In:',intake,'Out:',outtake,'In foster:',length)
结果返回为:
In: 2020-04-22 00:00:00 Out: 2020-07-08 00:00:00 In foster: 77 days,0:00:00
In: 2020-04-22 00:00:00 Out: 2020-05-01 00:00:00 In foster: 9 days,0:00:00
In: 2020-04-22 00:00:00 Out: 2020-05-02 00:00:00 In foster: 10 days,0:00:00
In: 2020-04-22 00:00:00 Out: 2020-06-01 00:00:00 In foster: 40 days,0:00:00
...
然后,我按照How to update rows in a CSV file中建议的步骤更新了CSV文件。
import csv
from datetime import datetime
from tempfile import NamedTemporaryFile
import shutil
filename = 'animals_20200826_12p46.csv'
tempfile = NamedTemporaryFile(mode='w',delete=False)
fields = ['Name','Status','Sex','Animal_ID','Birthdate','Adopter_City','Adopter_State','Adopter_Zip','Foster_City','Foster_State','Foster_Zip','Created_Date','Adopted_Date','Length']
with open(filename,'r') as csvfile,tempfile:
reader = csv.DictReader(csvfile,fieldnames= fields)
writer = csv.DictWriter(tempfile,fieldnames=fields)
for row in reader:
if len(row['Adopted_Date']) < 1 :
continue
intake = datetime.strptime(row['Created_Date'],'%Y-%m-%d')
row['Length'] = outtake - intake
writer.writerow(row)
shutil.move(tempfile.name,filename)
for循环的主要部分是相同的,但是现在我遇到了如下的回溯错误。
Traceback (most recent call last):
File "CSV.py",line 18,in <module>
intake = datetime.strptime(row['Created_Date'],'%Y-%m-%d')
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/_strptime.py",line 568,in _strptime_datetime
tt,fraction,gmtoff_fraction = _strptime(data_string,format)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/_strptime.py",line 349,in _strptime
raise ValueError("time data %r does not match format %r" %
ValueError: time data 'Created_Date' does not match format '%Y-%m-%d'
我哪里出错了?有什么比我目前的方法更好的方法呢?
解决方法
区别在于您正在使用的工作示例
import java.time.{Month,LocalDate}
import java.time.temporal.ChronoUnit.DAYS
val sasStart = LocalDate.of(1960,Month.JANUARY,1)
sasStart.plus(21558,DAYS).toString
//res0: String = 2019-01-09
在非工作示例中,您正在使用
DictReader(csvfile)
如果省略 fieldnames ,则文件 f 第一行中的值将用作字段名。
换句话说,如果省略DictReader(csvfile,fieldnames=fields)
,则消耗第一行以确定字段名,否则不消耗它,而是像迭代中的所有其他行一样发出它。
这会使包含列标题的初始行传递到fieldnames
。
我建议您再次为读者省略strptime
参数。
使用dateparser.parse代替datetime.strptime。
代码:
getMiddlePoint
,
更改此行:
reader = csv.DictReader(csvfile)
它将正常工作
fieldnames
是可选参数。如果 省略它,文件第一行中的值将用作 字段名称。
当您手动确定fieldnames
的每一行时,包括第一行应该是数据行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。