【问题标题】:Counting posts in a nested loop based on a date根据日期计算嵌套循环中的帖子
【发布时间】:2018-07-05 23:33:33
【问题描述】:

我需要计算今天/昨天/一周前/一个月前发布的帖子数量,从 json-dict 中提取 unix 格式的日期。通过 id 计算总和并从中制作一个表格。

但是,我花了很多时间弄清楚。

这是目前为止的代码:

posts_today = []

posts_yesterday = []
posts_week = []
posts_month = []
user_posted = []


today = pd.Timestamp('today')
yesterday = (pd.Timestamp('today')- pd.Timedelta(days=1))
week_ago = (pd.Timestamp('today') - pd.Timedelta(weeks=1))
month_ago = (pd.Timestamp('today') - pd.Timedelta(weeks=4))

一个月的循环本身:

for user_id in list(wall_pickle.keys())[0:100]:
    for i in wall_pickle[user_id]['items']:

        if ((pd.to_datetime(i['date']*10e8)) >= month_ago):
            user_posted.append(user_id)
            posts_month.append(1)

    print(user_id,len(posts_month))

产生

产生:

6932 6<br>
6984 6<br>
7074 6<br>
7141 6<br>
13456 6<br>
13467 6<br>
19226 6<br>
30365 11<br>
43713 31<br>
44611 31<br>
58972 42<br>
73013 43<br>
74905 44<br>
75089 45<br>
84090 47<br>
86882 47<br>
125789 47<br>
128317 47<br>
137443 66<br>
147006 85<br>
164366 85<br>
165490 95<br>
...

左列是 id,左列是计数,但是它会以某种方式累积。

JSON 方案如下所示:wall_pickle.keys() 是用户 ID,每个 ID 都有一个列表 ['items'] 和一个键 ['date']

请大家帮帮我!

【问题讨论】:

    标签: python json pandas for-loop


    【解决方案1】:

    其实我自己找到了答案。不是pythonic,也不是很酷,但它在大约 41K uid 上运行得很快,帖子深度为 20。

    posts_today = []
    posts_3_days = []
    posts_week = []
    posts_month = []
    
    today = pd.Timestamp(2018,1,26,0,0,0) 
    three_days_ago = (pd.Timestamp(2018,1,26,0,0,0)- pd.Timedelta(days=3))
    week_ago = (pd.Timestamp(2018,1,26,0,0,0) - pd.Timedelta(weeks=1))
    month_ago = (pd.Timestamp(2018,1,26,0,0,0) - pd.Timedelta(weeks=4))
    
    for user_id in list(wall_pickle.keys()):
        for i in wall_pickle[user_id]['items']:
    
            if ((pd.to_datetime(i['date']*10e8)) >= today):
                posts_today.append(user_id)
            if ((pd.to_datetime(i['date']*10e8)) >= three_days_ago):
                posts_3_days.append(user_id)
            if ((pd.to_datetime(i['date']*10e8)) >= week_ago):
                posts_week.append(user_id)
            if ((pd.to_datetime(i['date']*10e8)) >= month_ago):
                posts_month.append(user_id)
    

    它会生成匹配期间出现的 uid 列表 - 如果 X uid 在一周内有 3 个帖子,则循环将添加 X uid 3 次。 它看起来很糟糕,但是从那时起您可以使用.value_counts() 并获得一个dict,您可以将其映射到dataframe,这非常方便。

    类似这样的:

    # make a proper dataframe and save
    posts_today = pd.DataFrame(pd.Series(posts_today).value_counts())
    posts_today.reset_index(inplace=True)
    posts_today.columns=['user_id','daily_posts']
    posts_today.to_csv(RAW+'posts_today.csv', index=False)
    # the dict itself
    posts_today_dict = pd.Series(posts_today['daily_posts'].values,
                                 index=posts_today['user_id']).to_dict()
    

    ...等等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2016-06-24
      • 2019-01-27
      • 1970-01-01
      • 2015-11-04
      相关资源
      最近更新 更多