【问题标题】:Extracting key,values from a dictionary as a dataframe从字典中提取键、值作为数据框
【发布时间】:2018-01-31 09:37:21
【问题描述】:

我有一个从 json url 中提取的字典,它有 6 个键。我的兴趣只在于键 'value' 的值。数据结构如下:

    [in] print(data)
    [out] ...'values': [{'x': 1230940800, 'y': 0}, 
{'x': 1231113600, 'y': 0}, 
{'x': 1231286400, 'y': 0}, 
{'x': 1231459200, 'y': 0}, 
{'x': 1231632000, 'y': 0}, 
{'x': 1231804800, 'y': 0}, 
{'x': 1231977600, 'y': 0}, 
{'x': 1232150400, 'y': 0}, 
{'x': 1232323200, 'y': 0}, 
{'x': 1232496000, 'y': 0}, 
{'x': 1232668800, 'y': 0}, 
{'x': 1232841600, 'y': 0}, 
{'x': 1233014400, 'y': 0}, 
{'x': 1233187200, 'y': 0}, 
{'x': 1233360000, 'y': 0}] 

'x' 是 unix 时间戳,'y' 是那个时间的值。 如何从 'value' 字典中提取值并重新构造它们,以便将 'x' 标记为 'date' 并以这种格式构造:2011-09-13

【问题讨论】:

    标签: python pandas dictionary dataframe unix-timestamp


    【解决方案1】:

    如果我理解正确,pandas 应该能够将其转换为数据框:

    df = pd.DataFrame(values_dictionary).rename(columns={'x':'Date'})
    

    然后你可以使用 to_datetime 将其转换为 yyyy/mm/dd 格式:

    df['Date'] = pd.to_datetime(df['Date'].astype(str), unit='s')
    

    输出:

        Date        y
    0   2009-01-03  0
    1   2009-01-05  0
    2   2009-01-07  0
    3   2009-01-09  0
    4   2009-01-11  0
    5   2009-01-13  0
    6   2009-01-15  0
    7   2009-01-17  0
    8   2009-01-19  0
    9   2009-01-21  0
    10  2009-01-23  0
    11  2009-01-25  0
    12  2009-01-27  0
    13  2009-01-29  0
    14  2009-01-31  0
    

    【讨论】:

    • 这很接近但不起作用。我能够将“值”字典提取到数据框中,但我需要将“x”和“y”作为单独的列。
    • 我想我不太明白你的意思。创建的数据框 df 有两列:日期和 y。日期是 x,但我按照您的指示重命名了它。
    • 这是一个很好的答案。一行如果这意味着什么pd.DataFrame(lst).rename(columns=dict(x='Date')).assign(Date=lambda d: pd.to_datetime(d.Date, unit='s'))
    【解决方案2】:

    如果你想要的只是日期,我不知道你为什么想要一本字典。您可以执行此操作并获取日期列表。

    import datetime
    dates = [datetime.datetime.fromtimestamp(xydict['x']).strftime("%Y-%m-%d") for xydict in values]
    

    编辑:如果您想要类似的字典格式:

    import datetime 
    dates = [{'date' : datetime.datetime.fromtimestamp(xydict['x']).strftime("%Y-%m-%d")} for xydict in values]
    

    【讨论】:

    • 我想要键(即日期)和相应的值。
    • 您能否提供您想要获得的示例输出?
    【解决方案3】:

    假设您将 'values' 中保存的内容分配给名为 lst 的变量(例如 lst = data['value']),您可以使用:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'Date': np.array([subdct['x'] for subdct in lst], dtype='datetime64[s]'),
                       'y': [subdct['y'] for subdct in lst]})
    

    与:

    lst = [{'x': 1230940800, 'y': 0}, 
           {'x': 1231113600, 'y': 0}, 
           {'x': 1231286400, 'y': 0}, 
           {'x': 1231459200, 'y': 0}, 
           {'x': 1231632000, 'y': 0}, 
           {'x': 1231804800, 'y': 0}, 
           {'x': 1231977600, 'y': 0}, 
           {'x': 1232150400, 'y': 0}, 
           {'x': 1232323200, 'y': 0}, 
           {'x': 1232496000, 'y': 0}, 
           {'x': 1232668800, 'y': 0}, 
           {'x': 1232841600, 'y': 0}, 
           {'x': 1233014400, 'y': 0}, 
           {'x': 1233187200, 'y': 0}, 
           {'x': 1233360000, 'y': 0}]
    

    这给了我这个df

             Date  y
    0  2009-01-03  0
    1  2009-01-05  0
    2  2009-01-07  0
    3  2009-01-09  0
    4  2009-01-11  0
    5  2009-01-13  0
    6  2009-01-15  0
    7  2009-01-17  0
    8  2009-01-19  0
    9  2009-01-21  0
    10 2009-01-23  0
    11 2009-01-25  0
    12 2009-01-27  0
    13 2009-01-29  0
    14 2009-01-31  0
    

    【讨论】:

    • btc_usd2 = pd.DataFrame({'Date': np.array([subdct['x'] for subdct in btc_usd1], dtype='datetime64[s]'), 'y': [subdct['y'] for subdct in btc_usd1]}) TypeError: 字符串索引必须是整数
    • btc_usd = json.loads(url.read().decode()) btc_usd1 = pd.DataFrame(btc_usd) 出现在我刚刚复制的代码之前
    • 我并不是说你应该使用DataFrame 作为lst 变量。如果你使用lst = btc_usd['values'](来自btc_usd - 而不是btc_usd1!)然后运行我的代码会发生什么?
    • 这样行,所以不是原来的btc1,而是变成btc_usd1=btc_usd['values'],然后运行方法转换成数组,修复unix时间戳
    • @zsad512 您可以使用df = df.set_index('Date') 之后,其中df 必须替换为您的DataFrame 的变量名。
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多