如何利用pandas.read_csv()的date_parser参数 - python

我的csv文件中的timestamp列出现问题。

ValueError:无法将字符串转换为float:'2020-02-21 22:00:00'

对于这一行:

    import numpy as np
import pandas as pd
import matplotlib.pylab as plt 
from datetime import datetime
from statsmodels.tools.eval_measures import rmse
from sklearn.preprocessing import MinMaxScaler
from keras.preprocessing.sequence import TimeseriesGenerator
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
import warnings
warnings.filterwarnings("ignore")

"Import dataset"
df = pd.read_csv('fx_intraday_1min_GBP_USD.csv')


train, test = df[:-3], df[-3:]
scaler = MinMaxScaler()
scaler.fit(train) <----------- This line
train = scaler.transform(train)
test = scaler.transform(test)

n_input = 3
n_features = 4

generator = TimeseriesGenerator(train, train, length=n_input, batch_size=6)

model = Sequential()
model.add(LSTM(200, activation='relu', input_shape=(n_input, n_features)))
model.add(Dropout(0.15))
model.add(Dense(1))
model.compile(optimizers='adam', loss='mse')
model.fit_generator(generator, epochs=180)

如何将timestamp列(最好是在读取csv时)转换为浮点数?

如何利用pandas.read_csv()的date_parser参数 - python

链接到数据集:https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=GBP&to_symbol=USD&interval=1min&apikey=OF7SE183CNQLT9DW&datatype=csv

参考方案

读取数据时在CSV输入列上执行转换

读入CSV数据,将转换应用于timestamp列以获取浮点值:

>>> df = pd.read_csv('~/Downloads/fx_intraday_1min_GBP_USD.csv', 
...                  converters={'timestamp': 
...                                 lambda t: pd.Timestamp(t).timestamp()})
>>> df
       timestamp    open    high     low   close
0   1.582322e+09  1.2953  1.2964  1.2953  1.2964
1   1.582322e+09  1.2955  1.2957  1.2952  1.2957
2   1.582322e+09  1.2956  1.2958  1.2954  1.2957
3   1.582322e+09  1.2957  1.2958  1.2954  1.2957
4   1.582322e+09  1.2957  1.2958  1.2955  1.2956
..           ...     ...     ...     ...     ...
95  1.582317e+09  1.2966  1.2967  1.2964  1.2965
96  1.582317e+09  1.2967  1.2968  1.2965  1.2966
97  1.582317e+09  1.2965  1.2967  1.2964  1.2966
98  1.582317e+09  1.2964  1.2967  1.2962  1.2966
99  1.582316e+09  1.2963  1.2965  1.2961  1.2964

[100 rows x 5 columns]

这也可以应用于其他列。 converters参数采用字典,键为列名,值为函数。

如果时间戳数据跨越一列以上或采用某种奇怪的格式,则date_parser可能很有用。回调可以从一列或多列接收文本以进行处理。 parse_dates参数可能需要与date_parser一起提供,以指示将回调应用于哪些列。 date_parser只是列名称或索引的列表。用法示例:

df = pd.read_csv('~/Downloads/fx_intraday_1min_GBP_USD.csv', 
                 date_parser=lambda t: pd.Timestamp(t), 
                 parse_dates=['timestamp'])

没有日期/时间参数的pd.read_csv()会生成object类型的时间戳列。使用parse_dates只需指定哪一列是时间戳,而没有其他附加参数可以解决:

>>> df = pd.read_csv('~/Downloads/fx_intraday_1min_GBP_USD.csv', 
                     parse_dates=['timestamp'])
>>> df.dtypes
timestamp    datetime64[ns]
open                float64
high                float64
low                 float64
close               float64

读取CSV后的DataFrame列转换

正如另一个用户建议的那样,还有另一种使用pd.to_datetime()转换列内容的方法。

>>> df = pd.read_csv('~/Downloads/fx_intraday_1min_GBP_USD.csv')
>>> df.dtypes
timestamp     object
open         float64
high         float64
low          float64
close        float64
dtype: object
>>> df['timestamp'] = pd.to_datetime(df['timestamp'])
>>> df.dtypes
timestamp    datetime64[ns]
open                float64
high                float64
low                 float64
close               float64
dtype: object
>>> 
>>> df['timestamp'] = df['timestamp'].apply(lambda t: t.timestamp())
>>> df
       timestamp    open    high     low   close
0   1.582322e+09  1.2953  1.2964  1.2953  1.2964
1   1.582322e+09  1.2955  1.2957  1.2952  1.2957
2   1.582322e+09  1.2956  1.2958  1.2954  1.2957
3   1.582322e+09  1.2957  1.2958  1.2954  1.2957
4   1.582322e+09  1.2957  1.2958  1.2955  1.2956
..           ...     ...     ...     ...     ...
95  1.582317e+09  1.2966  1.2967  1.2964  1.2965
96  1.582317e+09  1.2967  1.2968  1.2965  1.2966
97  1.582317e+09  1.2965  1.2967  1.2964  1.2966
98  1.582317e+09  1.2964  1.2967  1.2962  1.2966
99  1.582316e+09  1.2963  1.2965  1.2961  1.2964

[100 rows x 5 columns]

或者不使用pd.to_datetime()一次完成所有操作:

>>> df = pd.read_csv('~/Downloads/fx_intraday_1min_GBP_USD.csv')
>>>
>>> df['timestamp'] = df['timestamp'] \
...                      .apply(lambda t: pd.Timestamp(t).timestamp())
>>>

从iPython运行ga.read_ga问题 - python

从iPython Notebook运行代码时遇到了问题。这是运行的代码:import pandas.io.ga as ga import gflags df = ga.read_ga(['visits', 'avgTimeOnSite'], dimensions=['date', 'hou…

Python-比较两个csv文件中的重复值,并将行写入单独的csv文件中 - python

我有2个.csv文件,它们具有数千行数据(来自供应商的产品库存)。我需要找到重复的商品并删除价格较高的商品。问题是价格包含小数。以下代码是我根据需要完成的最接近的代码:with open('vendor1.csv', 'r') as venOne, open('vendor2.csv', '…

csv.DictReader / csv.DictWriter vs熊猫库数据框- - python

我试图用Python编写一个程序,该程序将:从CSV文件读取数据,数据按日期排序通过查找最近365天(从csv文件中的最后一个数据点的日期起过去365天)来选择一些键和值,然后导出到另一个csv new_file根据写入new_file的数据绘制线形图(导出为图像文件)我是Python的新手,一直在研究:csv.DictReader(csv_file) / …

使用python中的多个定界符解析csv - python

                                我有一个csv,其头(row [0])用空格隔开,但其余行的内容用\ t隔开(许多单元格有多个空格)。如何解析此csv? 参考方案 您可以像以前一样解析csv(全部内容),然后使用regex(正则表达式)来保留或划分和分类所需的内容。

Python csv.reader()转换为JS吗? - javascript

我有一个python代码,例如:import csv reader = csv.reader(open('myText.txt', 'r'), delimiter=",") for row in reader: print row[0] + 'is' + row[1] + �…