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