我正在根据从地下天气下载的历史天气数据创建一个熊猫数据框。
import json
import requests
import pandas as pd
import numpy as np
import datetime
from dateutil.parser import parse
address = "http://api.wunderground.com/api/7036740167876b59/history_20060405/q/CA/San_Francisco.json"
r = requests.get(address)
wu_data = r.json()
因为我不需要所有数据,所以我只使用观察列表。此列表包含两个元素 - date和utcdate - 实际上是字典。
df = pd.DataFrame.from_dict(wu_data["history"]["observations"])
我想将我创建的数据帧与来自“漂亮”的解析日期一起编入索引。字典中的键。我可以通过使用数组索引来访问此值,但我无法在没有循环的情况下直接知道如何执行此操作。例如,对于第23个元素,我可以写
pretty_date = df["date"].values[23]["pretty"]
print pretty_date
time = parse(pretty_date)
print time
我得到了
11:56 PM PDT on April 05, 2006
2006-04-05 23:56:00
这就是我现在正在做的事情
g = lambda x: parse(x["pretty"])
df_dates = pd.DataFrame.from_dict(df["date"])
df.index = df_date["date"].apply(g)
df现在重新编制索引。此时我可以删除不需要的列。
有更直接的方法吗?
请注意,有时在同一日期有多个观察,但我在代码的不同部分处理数据清理,重复等。
答案 0 :(得分:1)
由于pretty
中保存的 dtype 只是对象,因此您只需将它们抓取到列表并获取索引即可。不确定这是否是你想要的:
# by the way, `r.json` should be without ()`
wu_data = r.json
df = pd.DataFrame.from_dict(wu_data["history"]["observations"])
# just index using list comprehension, getting "pretty" inside df["date"] object.
df.index = [parse(df["date"][n]["pretty"]) for n in range(len(df))]
df.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2006-04-05 00:56:00, ..., 2006-04-05 23:56:00]
Length: 24, Freq: None, Timezone: None
希望这有帮助。