python - 如何按日期对 CSV 文件进行排序?
问题描述
我已经阅读了几篇关于此的帖子(1、2、3),但我还不能让它工作。我有一个(简化的)CSV 文件,如下所示:
NOMBRE,APELLIDO,ID,NACIMIENTO,FECHAINGRESO,MAILPERSONAL,DEPARTAMENTO
name1,lastname1,123,2000-01-01,2021-03-13,mymail1@example-com,IT
name2,lastname2,456,1999-01-01,2020-01-21,mymail2@example-com,IT
我想根据标题对其进行排序,FECHAINGRESO
首先是最旧的日期,但不知道如何做到这一点。我在 Ubuntu 20 中使用 python 3.8.5 尝试过这个:
import csv
import os
from datetime import datetime
# With this I read the cvs and print it to check if everything is ok
with open('Empleados.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',')
for row in spamreader:
print(', '.join(row))
# The next is the code from several attempts where I failed to sort the cvs
with open('Empleados.csv', newline='') as csvfile:
# I wrote 4 because I belive the position 4 in the headers' row is the one with FECHAINGRESO
csvfile = sorted(csvfile, key = lambda row: datetime.strptime(row[4], "%d-%m-%Y"))
print(csvfile)
s = sorted(csvfile, key=lambda x:datetime.strptime(x[4],"%d-%m-%Y"), reverse=True)
print(s)
l = sorted(csvfile, key=lambda x: x[4], reverse=True)
print(l)
sortedlist = sorted(csvfile, key=operator.itemgetter(4), reverse=False)
print(sortedlist)
sortedlist = sorted(csvfile, key=lambda row: row[4], reverse=True)
print(sortedlist)
基本上它们都不起作用,因为它像字符串一样读取行并且通常返回此错误:
File "/home/Pruebas VSC/prueba_postgresql.py", line 31, in <module>
csvfile = sorted(csvfile, key = lambda row: datetime.strptime(row[4], "%d-%m-%Y"))
File "/home/Pruebas VSC/prueba_postgresql.py", line 31, in <lambda>
csvfile = sorted(csvfile, key = lambda row: datetime.strptime(row[4], "%d-%m-%Y"))
File "/usr/lib/python3.8/_strptime.py", line 568, in _strptime_datetime
tt, fraction, gmtoff_fraction = _strptime(data_string, format)
File "/usr/lib/python3.8/_strptime.py", line 349, in _strptime
raise ValueError("time data %r does not match format %r" %
ValueError: time data 'E' does not match format '%d-%m-%Y'
其中一些不会失败,但它们不会按 CSV 列中的日期排序。
最后一个 with-open 中的所有内容都是我在 google 中找到的其他问题的代码,但我不明白所有内容。希望有人可以帮助我了解如何对这个列表进行排序。我想稍后保存 CSV 文件,但我相信它在排序后应该很容易写入。
解决方案
正如@barny 指出的那样,您需要有一个清单。同样正如@DeepSpace 指出的那样,您可以对迭代执行排序操作。
其他几个问题。排序仅适用于没有标题行(不包含日期)。所以我将其删除以测试以下内容。我还必须调整您的日期格式字符串以"%Y-%m-%d"
匹配您的数据。
总而言之:
with open('Empleados.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',')
spamreader = sorted(spamreader, key=lambda x:datetime.strptime(x[4],"%Y-%m-%d"), reverse=True)
编辑:如果您也想干净地处理标题(而不是自己尝试学习练习),请使用以下内容。
with open('Empleados.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',')
header = next(spamreader)
spamreader = sorted(spamreader, key=lambda x:datetime.strptime(x[4],"%Y-%m-%d"), reverse=True)
spamreader.insert(0, header)
推荐阅读
- http - What is the default cookie path of a cookie set at path /a/b/c?
- javascript - 单选按钮的反应矩阵
- python - 如何对具有相同值的多个列进行布尔掩码
- ios - 如何在 MessagesExtension 应用程序中检测界面或设备方向?
- reactjs - 我应该为带有孩子的 TypeScript 道具使用什么类型?
- java - 不使用列表从数组中删除元素
- reactjs - 将 .wav 文件从 React 前端发送到 Flask 后端
- .net-core - 导航属性返回空属性
- java - 如何关闭多线程服务器?
- c# - 为什么 POST 方法返回空值?