我必须对流式 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"
我注意到有时位置为空,但随后有一个位置。
任何帮助将不胜感激,我开始变得绝望了! :')
编辑
另外,当我只使用 1/4 的 JSON 时,不会出现“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
列都充满了 nan:
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/