我试图用Numpy genfromttxt导入一个简单的CSV文件,但无法将第一列的数据转换为日期。
这是我的代码:
import numpy as np
from datetime import datetime
str2date = lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
data = np.genfromtxt('C:\\data.csv',dtype=None,names=True, delimiter=',', converters = {0: str2date})
我在str2date中得到以下错误:
TypeError:必须是str,而不是字节
问题是有很多列,所以我宁愿避免指定所有列类型(基本上都是数字)。
问题是传递给str2date
的参数的形式是b'%Y-%m-%d %H:%M:%S'
。这些是字节,理所当然地不能解析为日期时间对象。不过,这个问题的解决方案非常简单,因为您应该将字节字符串解码为UTF-8
字符串:
str2date = lambda x: datetime.strptime(x.decode("utf-8"), '%Y-%m-%d %H:%M:%S')
当我们想在csv文件中读取其值表示日期的列时,我们必须考虑它的表示方式,例如:
- 2021/12/05 = %Y/%m/%d
- 21/12/05 = %y/%m/%d
- 05/12/2021 = %d/%m/%Y
- 05/12/21 = %d/%m/%y
- 05-12-21 = %d-%m-%y
- ...
在创建lambda函数时,必须考虑这些表示日期的方法,我们将在NumPy getfromtxt()方法中将该函数用作转换器。这个方法接受几个参数,在这些参数中,我们可以找到可以以不同方式使用的转换器,在这种情况下,它将把列的值转换为日期类型的值
converters variable, optional
The set of functions that convert the data of a column to a value. The converters can also be used to provide a default value for missing data:
converters = {num_col: lambda_function }.
num_col-表示将应用函数的列的编号
lambda_function-表示我们将为转换构建的函数
对于这个例子,我们将有两列,日期和级别,用(;)和utf-8编码分隔:
日期 | 级别 |
---|---|
2015年3月2日 | 232.8 |
2015年3月9日 | 233.0 |
2015年3月16日 | 233.2 |
2015年3月23日 | 233.6 |
2015年3月30日 | 233.9 |
2015年4月6日 | 234.3 |
2015年4月13日 | 234.8 |
2015年4月20日 | 235.3 |
2015年4月27日 | 235.9 |
这是一个非常好的主意。当我尝试在Python 3.4中使用numpy时,我也遇到了同样的问题。对于python 2.7.10,这是不必要的。谢谢。:-)这是我的样品。
文件输入:
06-07-2016,95.5300,30877540.0000,94.6000,95.6600,94.3700
05-07-2016,95.0400,27553750.0000,95.3900,95.4000,94.4600
01-07-2016,95.8900,25982080.0000,95.4900,96.4650,95.3300*
代码:
dates = numpy.loadtxt(
'data.csv',
dtype = object,
converters={0: lambda x: datetime.datetime.strptime(x.decode("utf-8"), "%d-%m-%Y")},
delimiter=',',
usecols=(0,),
unpack=True
)