用python将google数据存储查询结果转换为pandas数据帧

用python将google数据存储查询结果转换为pandas数据帧,python,json,pandas,google-app-engine,google-cloud-platform,Python,Json,Pandas,Google App Engine,Google Cloud Platform,我需要将Google云数据存储查询结果转换为数据帧,以便从检索到的数据创建图表。查询: def fetch_times(limit): start_date = '2019-10-08' end_date = '2019-10-19' query = datastore_client.query(kind='ParticleEvent') query.add_filter( 'published_at', '>', start_date)

我需要将Google云数据存储查询结果转换为数据帧,以便从检索到的数据创建图表。查询:

def fetch_times(limit):
    start_date = '2019-10-08'
    end_date = '2019-10-19'
    query = datastore_client.query(kind='ParticleEvent')
    query.add_filter(
        'published_at', '>', start_date)
    query.add_filter(
        'published_at', '<', end_date)
    query.order = ['-published_at']
    times = query.fetch(limit=limit)
    return times

有没有一种方法可以通过迭代查询结果将其直接转换为数据帧,或者通过转换为json然后再转换为数据帧来将其转换为数据帧?

您可以使用
pd.read\u json
将json查询输出读取到数据帧中

假设输出是上面共享的字符串,那么下面的方法可以工作

#Extracting the beginning of the dictionary
startPos = line.find("{")

df = pd.DataFrame([eval(line[startPos:-1])])

输出如下所示:

     gc_pub_sub_id data            event              published_at  \
0  438169950283983  605  light intensity  2019-10-11T14:37:45.407Z   

                  device_id  
0  e00fce6847be7713698287a1 

这里,
行[startPos:-1]
实际上是字符串输入中的整个字典。使用
eval
,我们可以将其转换为实际的词典。一旦我们有了它,就可以很容易地将其转换为数据帧对象

您可以使用
pd.read\u json
将json查询输出读取到数据帧中

假设输出是上面共享的字符串,那么下面的方法可以工作

#Extracting the beginning of the dictionary
startPos = line.find("{")

df = pd.DataFrame([eval(line[startPos:-1])])

输出如下所示:

     gc_pub_sub_id data            event              published_at  \
0  438169950283983  605  light intensity  2019-10-11T14:37:45.407Z   

                  device_id  
0  e00fce6847be7713698287a1 

这里,
行[startPos:-1]
实际上是字符串输入中的整个字典。使用
eval
,我们可以将其转换为实际的词典。一旦我们有了它,就可以很容易地将其转换为dataframe对象

原始poster找到了一个解决方法,即将查询结果对象中的每个项转换为字符串,然后手动解析字符串以将所需的数据提取到列表中

Original poster找到了一种解决方法,即将查询结果对象中的每个项转换为字符串,然后手动解析字符串,将所需数据提取到列表中

数据存储实体可以被视为Python基础字典!所以你应该能做一些简单的事情,比如

df = pd.DataFrame(datastore_entities)
数据帧

假设输出是上面共享的字符串,那么下面的方法可以工作。 …剩下的都是熊猫

如果需要将实体
或其任何属性转换为列,可以将它们单独打包到字典中:

for e in entities: #go through entities
    e['entity_key'] = e.key #assign the entity key
    e['entity_key_name'] = e.key.name  # for example

df = pd.DataFrame(entities)

数据存储实体可以被视为基于Python的字典!所以你应该能做一些简单的事情,比如

df = pd.DataFrame(datastore_entities)
数据帧

假设输出是上面共享的字符串,那么下面的方法可以工作。 …剩下的都是熊猫

如果需要将实体
或其任何属性转换为列,可以将它们单独打包到字典中:

for e in entities: #go through entities
    e['entity_key'] = e.key #assign the entity key
    e['entity_key_name'] = e.key.name  # for example

df = pd.DataFrame(entities)

fetch
函数的返回值是
google.cloud.datastore.query.Iterator
,其行为类似于
列表[dict]
,因此
fetch
的输出可以直接传递到
pd.DataFrame

import pandas as pd

df = pd.DataFrame(fetch_times(10))

这类似于@bkitej,但我添加了原始海报函数的使用。

函数的
fetch
返回值是
google.cloud.datastore.query.Iterator
,其行为类似于
列表[dict]
,因此
fetch
的输出可以直接传递到
pd.DataFrame

import pandas as pd

df = pd.DataFrame(fetch_times(10))

这类似于@bkitej,但我添加了原始海报功能的使用。

感谢您的输入。查询输出不是真正的json,但类似于{keyword:value}。那么您能提供一些数据示例吗?如果没有正确的数据格式,就很难给出准确的解决方案。我在上面的
实体('ParticleEvent',5942717456580608){'gc_pub_sub_id':'438169950283983','data':'605','event':'light intensity','published_at':'2019-10-11T14:37:45.407Z','device_id':'E00FCE68477BE77136987A1'}
我找到了一个(相当肮脏的)解决办法。我将查询结果对象中的每个项转换为字符串,然后手动解析字符串以将所需数据提取到列表中。现在再看一下输出,我可能已经能够剪掉项的标题部分:
Entity('ParticleEvent',5942717456580608)
,这将只留下(键:值)。然后它可能会被识别为json,以便更容易地转换。您是否可以发布您的解决方案,作为对其他社区用户更高可视性的回答?谢谢,谢谢你的意见。查询输出不是真正的json,但类似于{keyword:value}。那么您能提供一些数据示例吗?如果没有正确的数据格式,就很难给出准确的解决方案。我在上面的
实体('ParticleEvent',5942717456580608){'gc_pub_sub_id':'438169950283983','data':'605','event':'light intensity','published_at':'2019-10-11T14:37:45.407Z','device_id':'E00FCE68477BE77136987A1'}
我找到了一个(相当肮脏的)解决办法。我将查询结果对象中的每个项转换为字符串,然后手动解析字符串以将所需数据提取到列表中。现在再看一下输出,我可能已经能够剪掉项的标题部分:
Entity('ParticleEvent',5942717456580608)
,这将只留下(键:值)。然后它可能会被识别为json,以便更容易地转换。您是否可以发布您的解决方案,作为对其他社区用户更高可视性的回答?非常感谢。是一个类似的职位,这将帮助你。这是为了能在控制台中打印出什么项目和整个gql_对象,以便提供解决方案?是一个类似的职位,这将帮助你。这是为了能在控制台中打印出什么项目和整个gql_对象,以便提供解决方案?