如何通过日期差将捐赠日期与社交媒体发帖日期分组?
问题描述
我正在分析某NGO的财务捐赠数据以及社交媒体互动对捐赠的影响,需要将捐赠日期与社交媒体发帖日期进行分组关联。捐赠日期存储在DataFrame的'Transaction Date'列,数据类型为datetime64[ns];社交媒体发帖日期从Facebook爬取后存入数组,数据类型为datetime.date。
我的代码尝试以发帖日期为键创建字典,将发帖日期两天内的捐赠日期归类到对应键下,但循环逻辑和条件判断出现问题:日期差判断错误,所有迭代都满足条件,同时不清楚如何转换数据类型以实现日期差的无缝计算。
donation_timestamp = pd.DataFrame() donation_timestamp['Dates'] = np.array(['2019-05-01', '2019-05-12', '2019-05-23']) donation_timestamp['Dates'] = pd.to_datetime(donation_timestamp['Dates']) post_dates = pd.to_datetime(scraped_dates) post_timestamps = [] for i in post_dates: time = dt.datetime.strptime(str(i), "%Y-%m-%d %H:%M:%S").date() post_timestamps.append(time) post_timestamps = np.array(post_timestamps) post_donations = dict.fromkeys(post_timestamps) for i in post_timestamps: for j in donation_timestamp: if j-i < dt.timedelta(days=2): post_donations[i] = np.append(post_donations[i], j)
修改建议
1. 统一日期数据类型,避免冗余转换
post_dates已经是datetime64[ns]类型,无需通过strptime重新解析字符串,直接提取date对象或保留Timestamp类型即可:# 直接获取date对象 post_timestamps = post_dates.date # 或保留Timestamp类型,后续时差计算更灵活 post_timestamps = post_dates
2. 修复循环遍历对象错误
原代码中for j in donation_timestamp遍历的是DataFrame的列名(此处为'Dates'),而非具体日期值,应改为遍历列中的日期数据:
for j in donation_timestamp['Dates']:
3. 修正日期差判断逻辑
日期差需要取绝对值,否则捐赠日期早于发帖日期超过2天时,负数会错误满足< timedelta(days=2)的条件:
# 若用datetime.date类型 if abs(j.date() - i) < dt.timedelta(days=2): # 若用pandas Timestamp类型 if abs(j - i) < pd.Timedelta(days=2):
4. 优化字典初始化与赋值逻辑
dict.fromkeys会让所有键指向同一个初始值(None),使用np.append会报错,应初始化每个键对应空列表:post_donations = {date: [] for date in post_timestamps}- 直接用列表
append添加数据,无需使用np.append(除非需要数组类型):post_donations[i].append(j)
完整优化代码
import pandas as pd import numpy as np import datetime as dt # 模拟捐赠数据 donation_timestamp = pd.DataFrame() donation_timestamp['Dates'] = np.array(['2019-05-01', '2019-05-12', '2019-05-23']) donation_timestamp['Dates'] = pd.to_datetime(donation_timestamp['Dates']) # 模拟爬取的发帖日期数组 scraped_dates = [dt.date(2019,5,10), dt.date(2019,5,21)] post_dates = pd.to_datetime(scraped_dates) # 统一使用Timestamp类型 post_timestamps = post_dates # 初始化字典,每个键对应空列表 post_donations = {date: [] for date in post_timestamps} # 关联发帖日期与对应2天内的捐赠日期 for post_date in post_timestamps: for donation_date in donation_timestamp['Dates']: if abs(donation_date - post_date) < pd.Timedelta(days=2): post_donations[post_date].append(donation_date) # 可选:转换为datetime.date类型输出 post_donations = {k.date(): [v.date() for v in vals] for k, vals in post_donations.items()} print(post_donations)
内容的提问来源于stack exchange,提问作者DeadWolf42
相关产品推荐
相关产品推荐

