python 讀取yyyy-mm-dd 日期
問題解決
在對“上證指數”數據進行處理的過程中,遇到了利用 numpy
讀取YYYY-MM-DD
格式的問題。
對於%m%d%Y
格式的日期,可利用matplotlib.dates.strpdate2num('%m%d%Y')
進行處理。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
date,open,close=np.loadtxt('000001.csv',delimiter=',',converters={0:mdates.strpdate2num('%m%d%Y')},skiprows=1,usecols=(0,3,6),unpack=True)
對於%Y-%m-%d
格式的日期,需要事先創建一個映射函數,將時間轉換爲浮點數,並在np.loadtxt()
中的 converters
中進行使用。
import numpy as np
import matplotlib.pyplot as plt
import datetime
import time
#def convert_to_tic(s):
# return time.mktime(datetime.datetime.strptime(s.decode('ascii'), "%Y-%m-%d").timetuple())
def datestring2num(s):
return mdates.datestr2num(s.decode('ascii'))
date, close, open = np.loadtxt('000001.csv', delimiter=',', converters={0: datestring2num}, skiprows=1, usecols=(0, 3, 6), unpack=True) # 將日期進行轉化
plt.plot(date, open)
plt.show()
報錯分析
- 在使用
datetime.datetime.strptime(s, "%Y-%m-%d")
,若s
後不進行解碼操作,在調用過程中會出現如下報錯:
源碼如下:
def convert_to_tic(s):
return time.mktime(datetime.datetime.strptime(s, "%Y-%m-%d").timetuple())
dates=np.loadtxt('data.csv', delimiter=',', usecols=(0,), converters={1: convert_to_tic}, unpack=True)
報錯:
TypeError: strptime() argument 1 must be str, not bytes
- 源碼如下:
def datestring2num(s):
return mdates.datestr2num(s)
dates=np.loadtxt('data.csv', delimiter=',', usecols=(0,), converters={1: datestring2num}, unpack=True)
報錯:
AttributeError: 'numpy.ndarray' object has no attribute 'toordinal'
這是因爲我們是以二進制編碼的格式打開第一列值,返回的值字節字符串bytes,所以需要把它編譯回string,則對字符串解碼用函數decode('ascii')
,變成string格式。
參考鏈接
[1] 關於TypeError: strptime() argument 1 must be str, not bytes解析
[2] Numpy 常用函數及讀寫操作
[3] Convert date column in dataframe to ticks in python
[5] python docs - [datetime
](https://docs.python.org/3/library/datetime.html?highlight=time strptime#module-datetime) — Basic date and time types