python - 如何有效地将 Array 转换为具有 datetime ohlcv 的 pandas 数据帧,还将列值除以 100?
问题描述
以下是我从 api 获得的 json 输出
{
"data": [
[
1594373520,
43625,
43640,
43565,
43600,
59561
],
[
1594373820,
43600,
43650,
43505,
43565,
127844
],
[
1594374120,
43560,
43680,
43515,
43660,
74131
]
],
"message": "",
"status": "success"
}
我想将此 json/array 转换为时间戳,具有 DateTime 索引的 ohlcv 数据,并且 ohlc 值必须除以 100 或有时除以 10000,具体取决于刻度大小。
最终输出必须如下所示:
date open high low close volume
0 2018-04-12 09:15:00+05:30 295.00 295.75 293.25 293.80 55378
1 2018-04-12 09:20:00+05:30 293.75 293.75 292.55 292.95 32219
2 2018-04-12 09:25:00+05:30 292.95 293.40 292.65 292.80 23643
3 2018-04-12 09:30:00+05:30 292.80 293.00 292.75 292.80 12313
4 2018-04-12 09:35:00+05:30 292.75 292.85 291.50 291.55 32198
我知道答案在 SO 上可用,但我想用更少的代码和更快的执行来有效地做到这一点。此外,如果我得到 1 分钟的数据,当前数据是 5 分钟,我想创建一个函数来相应地重新采样数据。
我会尽快用我当前的代码更新这个问题。
除以 100 的代码。我想为 4 列(o、h、l、c)执行此操作。寻找一个班轮。
df['A'] = df['A'].div(100).round(2)
更新:: 查询是否可以有效地完成?
我当前的代码::
import pandas as pd
records = data['data']
df = pd.DataFrame(records, columns=['datetime', 'open', 'high', 'low', 'close', 'volume'])
df['datetime'] = df['datetime'].apply(pd.Timestamp, unit='s', tzinfo=pytz.timezone("Asia/Kolkata"))
df['open'] = df['open'].astype(float).div(100)
df['high'] = df['high'].astype(float).div(100)
df['low'] = df['low'].astype(float).div(100)
df['close'] = df['close'].astype(float).div(100)
df.set_index('datetime', inplace=True)
print(df)
输出 ::
open high low close volume
datetime
2020-08-12 09:00:00+05:30 3124.0 3124.0 3120.0 3121.0 168
2020-08-12 09:05:00+05:30 3121.0 3124.0 3121.0 3123.0 163
2020-08-12 09:10:00+05:30 3123.0 3124.0 3122.0 3123.0 133
2020-08-12 09:15:00+05:30 3123.0 3125.0 3122.0 3122.0 154
2020-08-12 09:20:00+05:30 3122.0 3125.0 3122.0 3125.0 131
... ... ... ... ... ...
2020-08-13 23:05:00+05:30 3159.0 3162.0 3157.0 3159.0 432
2020-08-13 23:10:00+05:30 3159.0 3161.0 3155.0 3156.0 483
2020-08-13 23:15:00+05:30 3156.0 3160.0 3154.0 3159.0 1344
2020-08-13 23:20:00+05:30 3159.0 3167.0 3156.0 3165.0 284
2020-08-13 23:25:00+05:30 3165.0 3167.0 3162.0 3164.0 166
[348 rows x 5 columns]
解决方案
如果你想一起运行,我想你也可以使用下面的方法。这是回答您问题的最佳方式吗?
df[['open','high','low','close']] = df[['open','high','low','close']].astype(float).div(100)
datetime open high low close volume
0 2020-07-10 15:02:00+05:30 436.25 436.4 435.65 436.00 59561
1 2020-07-10 15:07:00+05:30 436.00 436.5 435.05 435.65 127844
2 2020-07-10 15:12:00+05:30 435.60 436.8 435.15 436.60 74131
推荐阅读
- c++ - c ++试图在函数之外更改局部变量?
- docker - Gitlab-Runner 向 docker 容器发出命令
- filtering - 为什么 cutadapt 不过滤任何读取?
- excel - VBA,自动过滤和复制大量数据
- python - 为什么formview django get方法中没有传递上下文?姜戈,蟒蛇
- javascript - 验证参数的所有 Object.keys() 是否等于特定键(JavaScript)
- java - 如何获取使用 Jetty 客户端连接所需的时间
- r - 正则表达式匹配R中的杂散逗号
- algorithm - 语言 (a+)* 是否与 a* 相同?
- python - 递归合并排序与非递归合并