【问题标题】:fail to use numpy loadtxt to convert date with python3.6无法使用 numpy loadtxt 用 python3.6 转换日期
【发布时间】:2018-03-30 14:18:20
【问题描述】:

我的代码如下:

import numpy as np
import matplotlib.dates as mdates

stockFile = 'HistoricalQuotes.csv'

dates, close = np.loadtxt(stockFile, delimiter=',', unpack=True, usecols=(0,1), \
                          converters = {0: mdates.strpdate2num('%Y-%m-%d')})
print("Dates = ", dates)

和追溯:

Traceback (most recent call last):


File "/Users/zdlzdlxs/Documents/workspace/pynum_practice/part3/simplestats.py", line 7, in <module>
    converters = {0: mdates.strpdate2num('%Y-%m-%d')})
  File "/Users/zdlzdlxs/Library/Python/3.6/lib/python/site-packages/numpy/lib/npyio.py", line 1024, in loadtxt
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "/Users/zdlzdlxs/Library/Python/3.6/lib/python/site-packages/numpy/lib/npyio.py", line 1024, in <listcomp>
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "/Users/zdlzdlxs/Library/Python/3.6/lib/python/site-packages/matplotlib/dates.py", line 287, in __call__
    return date2num(datetime.datetime(*time.strptime(s, self.fmt)[:6]))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_strptime.py", line 559, in _strptime_time
    tt = _strptime(data_string, format)[0]
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_strptime.py", line 329, in _strptime
    raise TypeError(msg.format(index, type(arg)))
TypeError: strptime() argument 0 must be str, not <class 'bytes'>

我试图在 stackoverflow 中找到解决方案,但失败了。 谁能帮我正确转换日期时间?非常感谢。

【问题讨论】:

标签: python numpy datetime


【解决方案1】:

这个日期转换器需要一个常规字符串,在 Py3 中是 unicode。但是loadtxt 将文本加载为字节串:

In [12]: mdates.strpdate2num('%Y-%m-%d')(b'1999-01-31')
---------------------------------------------------------------------------
....
TypeError: strptime() argument 0 must be str, not <class 'bytes'>

修改转换器为decode字节串应该可以解决这个问题:

In [13]: fn = lambda astr: mdates.strpdate2num('%Y-%m-%d')(astr.decode())

In [14]: fn(b'1999-01-01')
Out[14]: 729755.0

在 loadtxt 中测试:

In [15]: txt=b"""1999-01-01
    ...: 2000-03-03
    ...: 2015-12-12
    ...: """

In [16]: np.loadtxt(txt.splitlines(), converters={0:fn})
Out[16]: array([ 729755.,  730182.,  735944.])

【讨论】:

  • @Jack 如果此答案解决了您的问题,您应该接受它(单击它旁边的复选标记)。这有两件事。它让每个人都知道您的问题已得到您满意的解决,并为帮助您的人提供帮助。 See here 以获得完整的解释。
  • 嗨,我有同样的问题,但代码略有不同,我似乎无法为您提供解决方案。 date, bid, ask = np.loadtxt('data/GBPUSD1d.txt', unpack = True, delimiter = ',', converters = {0:mdates.strpdate2num('%Y%m%d%H%M%S')})
猜你喜欢
  • 1970-01-01
  • 2017-12-21
  • 2015-09-29
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
相关资源
最近更新 更多