#python
#python
Вопрос:
У меня проблема с преобразованием времени. Столбец [0] — это временная метка, я хочу вставить новый столбец в [1], пока он называется timestamp2. Затем я пытаюсь использовать оператор for для преобразования столбца [0] в время чтения и добавления его в столбец [1]. В настоящее время я вставляю новый столбец, но получаю эту ошибку:
вызвать ошибку TypeError(f «невозможно преобразовать ряд в {конвертер}») Ошибка типа: не удается преобразовать ряд в <class ‘int’>
Я добавил .astype(int) в переменную timestamp, но это не помогло. Код:
import requests
import json
import pandas as pd
from datetime import datetime
url = 'https://us.market-api.kaiko.io/v2/data/trades.v1/exchanges/cbse/spot/btc-usd/aggregations/count_ohlcv_vwap?interval=1hamp;page_size=1000'
KEY = 'xxx'
headers = {
"X-Api-Key": KEY,
"Accept": "application/json",
"Accept-Encoding": "gzip"
}
res = requests.get(url, headers=headers)
j_data = res.json()
parse_data = j_data['data']
# create dataframe
df = pd.DataFrame.from_dict(pd.json_normalize(parse_data), orient='columns')
df.insert(1, 'timestamp2', ' ')
for index, row in df.iterrows():
timestamp = df['timestamp'].astype(int)
dt = datetime.fromtimestamp(timestamp)
df.at[index, "timestamp2"] = dt
print(df)
df.to_csv('test.csv', index=False, encoding='utf-8')
Проанализированные данные:
timestamp,timestamp2,open,high,low,close,volume,price,count
1611169200000,5,35260,35260.6,35202.43,35237.93,7.1160681299999995,35231.58133242965,132
1611165600000,5,34861.78,35260,34780.26,35260,1011.0965832999998,34968.5318431902,11313
1611162000000,5,34730.11,35039.98,34544.33,34855.43,1091.5246025199979,34794.45207484006,12877
В этом примере я установил ‘df.at [index, «timestamp2»] = dt’ до 5 просто чтобы убедиться, что он вставлен в каждую строку, он делает это, поэтому мне просто нужно преобразовать столбец [0] в время чтения для столбца [1].
Комментарии:
1. привет, можете ли вы поделиться примером того, как выглядит parse_data?
2. нет проблем, просто добавил
3. хорошо, я могу решить, основываясь на приведенных ниже примерах значений, это нормально?
Ответ №1:
Если вы преобразуете метку времени в целое число, кажется, что с момента epoc прошло миллисекунды, исходя из значений значений.
Вот еще несколько подробностей о времени unix, если вам интересно. https://en.wikipedia.org/wiki/Unix_time
Вы можете преобразовать это в datetime, используя pd.to_datetime .
Это векторизованная операция, поэтому вам не нужно использовать цикл через фрейм данных. Как pd.to_numeric, так и pd.to_datetime могут быть применены ко всей серии.
Сложно отлаживать без всех ваших данных, но приведенное ниже должно работать. .astype(int) является альтернативой pd.to_numeric , единственное отличие в том, что pd.to_numeric дает вам больше гибкости при обработке ошибок, позволяя принудительно использовать nan (не уверен, нужно это или нет).
import pandas as pd
df = pd.DataFrame({'timestamp':['1611169200000']})
# convert to integer. If there are invalid entries this will set to nan. Depends on your case how you want to treat these.
timestamp_num = pd.to_numeric(df['timestamp'],errors='ignore')
df['timestamp2'] pd.to_datetime(timestamp_num,unit='ms')
print(df.to_dict())
#{'timestamp': {0: '1611169200000'}, 'timestamp2': {0: Timestamp('2021-01-20 19:00:00')}}