Какой это формат даты и времени и как мне его анализировать? - PullRequest
0 голосов
/ 24 августа 2018

У меня есть некоторые данные, которые я извлекаю из API, и дата отформатирована так: '1522454400000'

Не знаю, как ее проанализировать, но это то, что я пробовал (безуспешно пытался)

df = DataFrame(test)
df.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
df.set_index('Date')
df.index = pd.to_datetime(df.index, unit = 'd')

где переменная test представляет собой список базовых данных.это неправильно анализирует данные за 1970 год.

Результат анализа:

1970-01-01 00:00:00.000000000

Есть идеи?

********************** РЕДАКТИРОВАТЬ ************************************

Версия Python: 3

Версия Pandas.0.23.0

Вот рабочий пример воспроизводимости.Но сначала, вот факты, которые я обнаружил.

ФОРМАТ ДАТЫ: 64-битная метка времени Unix в миллисекундах с начала эпохи 1 января 1970

TIMEZONE: UTC

МОЯ TIMEZONE:UTC + 4 (требуемый индекс даты и времени)

Код:

import bitmex
import pandas as pd
from pandas import DataFrame
import datetime
import ccxt

api_connector = ccxt.bitmex({
    'enableRateLimit': True
})

#get OHLCV Data
testdata = api_connector.fetch_ohlcv('XBTZ18', '1h')

df2 = DataFrame(testdata)
df2.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']
#df2.set_index('Date')
df2.index = pd.to_datetime(df2.Date, unit='ms')
df3 = df2.drop(['Date'],
              axis =1)
df3.tail()

Возвращает:

Open    High    Low Close   Volume
Date                    
2018-07-06 00:00:00 6538.5  6555.0  6532.5  6537.0  176836
2018-07-06 01:00:00 6537.0  6535.5  6520.5  6524.5  139735
2018-07-06 02:00:00 6524.5  6542.5  6525.5  6542.5  59759
2018-07-06 03:00:00 6542.5  6545.0  6538.0  6538.0  121410
2018-07-06 04:00:00 6538.0  6538.5  6477.5  6525.0  764125

Закрыть!но без сигарыСегодняшняя дата - 31.08.2008, поэтому я бы, по крайней мере, ожидал, что она будет в правильном месяце.

Что я делаю не так, ребята?

1 Ответ

0 голосов
/ 24 августа 2018

Это почти наверняка вариация "Unix time" : вместо секунд с 1 января 1970 года, это миллисекунд с 1 января 1970 года:

>>> datetime.datetime.utcfromtimestamp(int('1522454400000') / 1000)
datetime.datetime(2018, 3, 31, 0, 0)

Это, конечно, похоже на разумную дату.И даже похоже, что это скорее UTC, а не местное время (если только вы не в Англии или не ожидали, что это будет ровно в полночь).


Я не думаю, чтовстроенных форматов Pandas (которые на самом деле являются просто обертками для форматов datetime и / или dateutil) в точности соответствует этому, поэтому вам, вероятно, придется либо делать то, что я делал (преобразовать в int и обработать его)как число) или выполните строковый эквивалент (отрежьте последние 3 символа, а затем обработайте как строку метки времени UNIX).

Первый выглядит проще:

>>> pd.to_datetime(int('1522454400000'), unit='ms')
Timestamp('2018-03-31 00:00:00')

Вна самом деле, он даже будет работать напрямую со строками, неявно выполняя преобразование:

>>> pd.to_datetime('1522454400000', unit='ms')
Timestamp('2018-03-31 00:00:00')
...