【问题标题】:the dtype parameter in numpy genfromtxtnumpy genfromtxt 中的 dtype 参数
【发布时间】:2014-02-26 09:08:18
【问题描述】:

我正在尝试从以下文件内容创建 MX2 numpy 矩阵或数组:

shell: head WORLD#America.csv
"2013-04-17 12","3","WORLD","#America"
"2013-04-17 13","9","WORLD","#America"
"2013-04-17 14","4","WORLD","#America"
"2013-04-17 15","3","WORLD","#America"
"2013-04-17 16","7","WORLD","#America"
"2013-04-17 17","8","WORLD","#America"
"2013-04-17 18","6","WORLD","#America"
"2013-04-17 19","6","WORLD","#America"
"2013-04-17 20","6","WORLD","#America"
"2013-04-17 21","2","WORLD","#America"

我遇到了genfromtxt() 函数,但未能成功提取我的数据。使用一个名为 f 的文件,我尝试了以下操作:ts = genfromtxt(f, delimiter=",") 并得到了一个用 nan 填充的数组。这只是第一次尝试,所以我阅读了有关 dtype 参数的文档,该参数指定了数组的数据类型。看来,要获得一个包含(datetime, int) 形式的条目的 MX2 矩阵,我将拥有以下内容:dtype=[('f1', datetime64), ('f2', uint)]。当我这样做时,我将以下内容分配给变量ts

(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L),
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L)],
dtype=[('f1', ('<M8[us]', {})), ('f2', '<u8')])

我为矩阵得到的每个值都是一些常数...为什么它没有从我的文件中读取? 显然这不是我应该得到的输出。

如何获得所需的 MX2 矩阵或数组,其中第一列为 datetime,第二列为整数,如 head 命令所示?

【问题讨论】:

  • 查看此答案:stackoverflow.com/questions/2664790/… 我怀疑您的报价造成了麻烦,您需要手动编写转换器。
  • 第一列的第一项是"2013-04-17 12"12 在那个字段中是什么意思?是一天中的某个小时,还是一个单独的数据字段?
  • 小时,正确!

标签: python arrays numpy genfromtxt


【解决方案1】:

正如 cmets 中所指出的,使用genfromtxt 读取此文件的一个困难是存在引号字符。也许最好只(以编程方式)删除引号,但也可以绕过这个问题:将引号字符指定为分隔符:

np.genfromtxt(filename, delimiter='"', dtype=str, comments=None)[0]
# array(['', '2013-04-17 12', ',', '3', ',', 'WORLD', ',', '#America', ''], 
#       dtype='|S13')

现在文件被解释为有 9 列,其中第二列和第四列包含感兴趣的数据。

另一个问题是为日期时间列指定 dtype。在 Numpy 的最新(?)版本中,您必须指定时间/日期单位,否则 genfromtxt 会引发错误。在这种情况下,显然您需要使用 M8[h] 作为 dtype,以指定小时单位。

总而言之,我能够通过以下方式加载文件:

ts = np.genfromtxt(filename, 
                   delimiter='"', 
                   dtype='M8[h], uint', 
                   usecols=[1,3])

或者,您可以查看using a converter 或尝试the CSV reader from Pandas

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 2012-12-09
    • 2014-03-24
    • 2017-03-21
    • 2012-05-10
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多