You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过日期差将捐赠日期与社交媒体发帖日期分组?

问题描述

我正在分析某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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:54:54