Как использовать параметр date_parser pandas .read_csv () - PullRequest
3 голосов
/ 22 февраля 2020

У меня проблема со столбцом timestamp в моем CSV-файле.

ValueError: не удалось преобразовать строку в число с плавающей точкой: '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) в число с плавающей точкой?

enter image description here

Ссылка на набор данных : https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=GBP&to_symbol=USD&interval=1min&apikey=OF7SE183CNQLT9DW&datatype=csv

Ответы [ 3 ]

2 голосов
/ 22 февраля 2020

Выполнение преобразования во входных столбцах CSV при чтении данных

Чтение данных CSV с применением преобразования в столбец отметки времени для получения значений с плавающей запятой:

>>> 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

Преобразование столбцов DataFrame после чтения в CSV

Как предложил другой пользователь, есть другой способ чтобы преобразовать содержимое столбца, используя 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())
>>>
1 голос
/ 22 февраля 2020

Похоже, вы пытаетесь преобразовать строку в объект Datetime.

Для этого вам нужно будет использовать datetime.strptime со строкой форматирования в качестве второго аргумента. Эта строка должна соответствовать формату даты в вашем CSV-файле.

Так что вам понадобится этот код для преобразования вашей временной строки в объект Datetime:

from datetime import datetime

df = pd.read_csv('intraday.csv')
dftime = datetime.strptime(df, '%Y-%m-%d %H:%M:%S')

После этого, Вы можете делать все, что хотите, с dftime. Если вы хотите, чтобы это было число с плавающей точкой (или метка времени), вы можете использовать этот код:

timestamp = datetime.timestamp(dftime)

Надеюсь, это поможет:)

0 голосов
/ 22 февраля 2020

Вы можете использовать метод pandas для преобразования всего столбца в дату и время:

импорт pandas как pd

pd.to_datetime (column)

, а затем, если Вы хотите, чтобы этот столбец использовался в качестве индекса:

pd.set_index (column)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...