在 Numpy genfromtxt 中加载日期
Loading a date in Numpy genfromtxt
我正在尝试使用 Numpy genfromtxt 导入一个简单的 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: must be str, not bytes
问题是有很多列,所以我宁愿避免指定所有列类型(基本上是数字)。
问题是传递给 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')
这是个好主意。当我尝试将 numpy 用于 Python 3.4 时,我遇到了同样的问题。对于 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
)
当我们想在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
- ...
在创建我们将用作 NumPy getfromtxt() 方法中的转换器的 lambda 函数时,必须考虑这些表示日期的方式。这个方法接受几个参数,在这些参数中,我们可以找到我们可以以不同方式使用的转换器,在这种情况下,它将把一列的值转换成日期类型值
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 编码分隔:
date
level
02-03-15
232.8
09-03-15
233.0
16-03-15
233.2
23-03-15
233.6
30-03-15
233.9
06-04-15
234.3
13-04-15
234.8
20-04-15
235.3
27-04-15
235.9
我们的代码应该是:
import numpy as np
from datetime import datetime
str2date = lambda x: datetime.strptime(x, '%d-%m-%y')
data = np.genfromtxt(file_path, delimiter=';', dtype=None, names=True, converters = {0: str2date}, encoding='utf-8')
变量file_path将替换为文件的目录,包括文件名及其扩展名。
定界符:str、int或sequence,可选。用于分隔值的字符串。默认情况下,任何连续的空格都充当分隔符。也可以提供整数或整数序列作为每个字段的宽度。
dtype:dtype,可选。结果数组的数据类型。如果None,数据类型将由每一列的内容单独确定。
names : {None, True, str, sequence},可选。如果名称为 True,则从前 skip_header 行之后的第一行读取字段名称。此行可以有选择地由注释定界符继续。如果名称是一个序列或逗号分隔名称的单个字符串,则名称将用于定义结构化数据类型中的字段名称。如果名称是 None,将使用 dtype 字段的名称(如果有的话)。
编码:str,可选。用于解码输入文件的编码。
要提取数据并使用它,我们可以:
levels= data['level']
dates= data['date']
我正在尝试使用 Numpy genfromtxt 导入一个简单的 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: must be str, not bytes
问题是有很多列,所以我宁愿避免指定所有列类型(基本上是数字)。
问题是传递给 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')
这是个好主意。当我尝试将 numpy 用于 Python 3.4 时,我遇到了同样的问题。对于 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
)
当我们想在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
- ...
在创建我们将用作 NumPy getfromtxt() 方法中的转换器的 lambda 函数时,必须考虑这些表示日期的方式。这个方法接受几个参数,在这些参数中,我们可以找到我们可以以不同方式使用的转换器,在这种情况下,它将把一列的值转换成日期类型值
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 编码分隔:
date | level |
---|---|
02-03-15 | 232.8 |
09-03-15 | 233.0 |
16-03-15 | 233.2 |
23-03-15 | 233.6 |
30-03-15 | 233.9 |
06-04-15 | 234.3 |
13-04-15 | 234.8 |
20-04-15 | 235.3 |
27-04-15 | 235.9 |
我们的代码应该是:
import numpy as np
from datetime import datetime
str2date = lambda x: datetime.strptime(x, '%d-%m-%y')
data = np.genfromtxt(file_path, delimiter=';', dtype=None, names=True, converters = {0: str2date}, encoding='utf-8')
变量file_path将替换为文件的目录,包括文件名及其扩展名。
定界符:str、int或sequence,可选。用于分隔值的字符串。默认情况下,任何连续的空格都充当分隔符。也可以提供整数或整数序列作为每个字段的宽度。
dtype:dtype,可选。结果数组的数据类型。如果None,数据类型将由每一列的内容单独确定。
names : {None, True, str, sequence},可选。如果名称为 True,则从前 skip_header 行之后的第一行读取字段名称。此行可以有选择地由注释定界符继续。如果名称是一个序列或逗号分隔名称的单个字符串,则名称将用于定义结构化数据类型中的字段名称。如果名称是 None,将使用 dtype 字段的名称(如果有的话)。
编码:str,可选。用于解码输入文件的编码。
要提取数据并使用它,我们可以:
levels= data['level']
dates= data['date']