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

Python Twitter JSON cannot extract location, place nor time_zone

我必须对流式 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'

这很奇怪,因为地点确实存在,尽管它有时为空

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

以下是 JSON 的摘录:

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

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

"location":"London"

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

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

编辑

此外,当我只使用了 JSON 的 1/4 时,"place" 错误没有出现

您的代码中有很多问题,最大的问题是 time_zone 不是您 json 中的键,它出现在某些 json 中,但出现在嵌套字典中。这将创建 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 在哪里,我们在每个 dict 的值,并找到使我们获得该 dict 的关键。

# 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)
....................................