- 给定文件
test.csv
中的以下示例数据
27-Mar-12,8.25,8.35,8.17,8.19,9801989
26-Mar-12,8.16,8.25,8.12,8.24,8694416
23-Mar-12,8.05,8.12,7.95,8.09,8149170
字符串
1.如何在不使用pandas
的情况下解析此文件?
1.打开文件
1.将日期列格式化为datetime
日期格式字符串
1.按列0(日期列)对所有行进行排序
1.保存回同一个文件,日期列有一个标题
- 在
pandas
中,这可以通过一行(长)代码来完成,不包括导入。 - 应该注意的是,如果不使用
date_parser
,使用parse_date
可能会非常慢。
import pandas as pd
(pd.read_csv('test.csv', header=None, parse_dates=[0], date_parser=lambda t: pd.to_datetime(t, format='%d-%b-%y'))
.rename(columns={0: 'date'})
.sort_values('date')
.to_csv('test.csv', index=False))
型
预期表单
date,1,2,3,4,5
2012-03-23,8.05,8.12,7.95,8.09,8149170
2012-03-26,8.16,8.25,8.12,8.24,8694416
2012-03-27,8.25,8.35,8.17,8.19,9801989
型
- 这个问题和答案是为了填补Stack Overflow上的知识内容空白而编写的。
- 使用
pandas
完成此任务非常简单。 - 在没有
pandas
的情况下,要想出创建完整解决方案的所有必要部分是非常困难的。 - 这对任何对此任务感兴趣的人以及禁止使用
pandas
的学生来说都是有益的。 - 我不介意看到一个使用
numpy
的解决方案,但问题的主要点是,只使用标准库中的包来完成这项任务。
4条答案
按热度按时间bvjxkvbb1#
使用尽可能少的导入:
字符串
r8uurelv2#
pandas
是更容易解析和清理文件的工具。pandas
,需要11行代码,需要一个for-loop
。csv
&datetime
.seek
和.truncate
list()
用于解包csv.reader
对象,但在遍历reader
时,它被删除以更新日期值。sorted
提供一个自定义键函数来自定义排序顺序,但我没有看到从lambda
表达式返回值的方法。key=lambda row: datetime.strptime(row[0], '%Y-%m-%d')
,但已被删除,因为更新的日期列不包含月份名称。字符串
更新
test.csv
型
%time
测试型
测试
型
测试功能
型
5sxhfpxr3#
正如OP所述,Pandas使这变得容易;另一种方法是使用DictReader和DictWriter选项;它仍然比使用Pandas更冗长(这里的抽象之美,Pandas为我们做了繁重的工作)。
字符串
由于字段名事先不知道,我们可以使用csvreader和csvwriter选项:
型
n3schb8v4#
这个排序/格式化任务可以在
mlr
中完成,而不需要任何编码。)个字符
感谢您的惊人的工作和文档约翰!