python - 将字符串从csv转换为日期和浮动格式

时间:2017-09-07 09:34:23

标签: python pandas csv date numpy

继续我之前的问题,时间数据与提供的格式(python - ValueError: time data does not match format)不匹配,我需要帮助将字符串转换为数据。

我从here下载了我的CSV文件。它有一个标题行和7列,第一列代表日期,其他代表数字。

转换为列表的第一个数据行如下所示:

['2010-06-29', '19.000000', '25.000000', '17.540001', '23.889999', '23.889999', '18766300']

我希望能够从中得到一个numpy数组:

import csv
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import urllib

def bytespdate2num(fmt, encoding="utf-8"):
    strconverter = mdates.strpdate2num(fmt)
    def bytesconverter(b): 
        s = b.decode(encoding)
        return strconverter(s)
    return bytesconverter

with open("TSLA.CSV", "r") as csvfile:
    stock_price = csv.reader(csvfile, delimiter=",")
    stock_price = list(stock_price)

date, closep, highp, lowp, openp, volume = np.loadtxt(stock_price, 
                                                      delimiter = ",",
                                                      unpack = True,
                                                      skiprows=1,
                                                      # '2010-06-29'
                                                      converters={0: bytespdate2num("['%Y-%m-%d'")}
                                                      )

麻烦的是,我收到以下错误:

  

ValueError:时间数据“['2010-06-29”与格式'%Y-%m-%d'不匹配

问题是日期之前的['。我尝试迭代列中的项目并替换['with“”;没用。然后我尝试给格式"['%Y-%m-%d'"只是为了看看会发生什么。这解决了这个错误(当然,我对这个解决方案不满意),但还有另一个错误:

  

ValueError:无法将字符串转换为float:b'18766300.0]'

我在谷歌上搜索并搜索但却一无所获......

2 个答案:

答案 0 :(得分:0)

numpy可以按如下方式使用:

from datetime import datetime
import matplotlib.dates as mdates
import numpy as np

def bytespdate2num(x):
    return mdates.date2num(datetime.strptime(x, '%Y-%m-%d'))

df = np.genfromtxt('TSLA.csv', delimiter=',', skip_header=1, converters={0: bytespdate2num}, dtype='int')

你需要决定一个合适的类型来存储所有数字。虽然Pandas可能是一个更好的匹配。

df将显示为:

[( 733952.,  19,  25,  17,  23,  23, 18766300)
 ( 733953.,  25,  30,  23,  23,  23, 17187100)
 ( 733954.,  25,  25,  20,  21,  21,  8218800) ...,
 ( 736573., 356, 357, 353, 355, 355,  3049500)
 ( 736577., 353, 355, 345, 349, 349,  3835100)
 ( 736578., 349, 350, 341, 344, 344,  4079000)]

答案 1 :(得分:-1)

您可以按如下方式使用pandas库:

import pandas as pd
dataset = pd.read_csv("TSLA.CSV")

date = dataset['Date']
# etc.

参考:pandas.read_csv