gpt4 book ai didi

Python Twitter JSON 无法提取位置、地点或时区

转载 作者:太空宇宙 更新时间:2023-11-04 01:01:53 25 4
gpt4 key购买 nike

我必须对流式 Twitter 数据进行分析。

tweets_data_path = 'allnews.txt'

tweets_data = []
tweets_file = open(tweets_data_path, "r")
for line in tweets_file:
try:
tweet = json.loads(line)
tweets_data.append(tweet)
except:
continue

tweets = pd.DataFrame()

我正在尝试运行以下两行:

tweets['Location'] = map(lambda tweet: tweet['place']['country'] if tweet['place'] != None else None, tweets_data)
tweets['time_zone'] = map(lambda tweet: tweet['time_zone'] if 'time_zone' in tweet else ' ', tweets_data)

对于第一行,我得到:

KeyError: 'place'

这很奇怪,因为 place 确实存在,尽管它有时为 null

对于第二行,我没有收到任何错误,但该列只是空的,尽管 JSON 中确实存在时区。

以下是 JSON 的摘录:

"place":null(note that there aren't quotations around null)

"time_zone":"Central Time (US & Canada)"

"location":"London"

我注意到有时 place 为 null 但随后有一个位置。

任何帮助将不胜感激,我开始变得绝望了! :')

编辑

此外,当我只使用 1/4 的 JSON 时,“放置”错误不会出现

最佳答案

您的代码中有很多问题,最大的问题是 time_zone 不是您的 json 中的键,它出现在某些 json 中,但出现在嵌套的 dict 中。这将创建 df:

import pandas as pd
import json
with open('news11pm.txt')as f:

tweets_data = []
for line in f:
try:
tweet = json.loads(line)
tweets_data.append(tweet)
except ValueError as e:
print(e)
pass


tweets = pd.DataFrame()
import numpy as np
tweets['Location'] = [tweet['place']['country']if "place" in tweet and tweet['place'] else np.nan for tweet in tweets_data ]
tweets['time_zone'] = [tweet['time_zone'] if 'time_zone' in tweet else np.nan for tweet in tweets_data]

在 df 上调用 dropna 给我们一个空的 df!这是因为 time_zone 不作为键存在,所以所有 time_zone 列都充满了 nans:

print(tweets["Location"].dropna())

Empty DataFrame
Columns: [Location, time_zone]
Index: []

要调试问题,几个简单的步骤将有助于将问题拼凑起来:

# find if there are missing keys and  where
for ind, d in enumerate(tweets_data):
if "time_zone" not in d:
print("No time_zone {}".format(ind))
elif "place" not in d:
print("No place {}".format(ind))

该循环确认 time_zone 实际上不作为键存在,并且 place 在两个字典中丢失,因此要找到 time_zone 在哪里我们在每个字典的值中寻找一个字典,然后找到可以让我们得到那个字典的键。

# now we know time_zone does not exist as a key, 
# check if it is in a nested dict value
for ind, d in enumerate(tweets_data):
for k, v in d.items():
if isinstance(v, dict) and "time_zone" in v:
print(k, ind, v["time_zone"])

所以在调试之后我们发现 time_zone 存在于一个嵌套的字典中,键为 user 所以把它们放在一起:

import numpy as np

tweets = pd.DataFrame()
tweets['Location'] = [tweet['place']['country'] if "place" in tweet and tweet['place']
else np.nan for tweet in tweets_data]
tweets['time_zone'] = [tweet["user"]['time_zone'] if "user" in tweet and tweet["user"]['time_zone']
else np.nan for tweet in tweets_data]

现在调用 drop_na 我们得到了一些更有用的东西:

                 Location                    time_zone
17 United Kingdom London
269 United States Eastern Time (US & Canada)
378 México Mountain Time (US & Canada)
409 India Chennai
660 United Kingdom Europe/London
1010 France Rome
1125 Polska Warsaw
1689 United States Eastern Time (US & Canada)
1902 United States Central Time (US & Canada)
1929 Kenya Baghdad
2248 United Kingdom London
2300 United Kingdom London
2441 United Kingdom Hawaii
2491 España Hawaii
2500 United Kingdom Amsterdam
2534 United States Pacific Time (US & Canada)
....................................

关于Python Twitter JSON 无法提取位置、地点或时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com