Преобразование и вставка метки времени в pandas

#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')}}