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

如何用Python识别日期结构并检查用户周活跃频次(含容错)

Solution: Date Structure Identification & Weekly Activity Check (With Fault Tolerance)

Hey there! Let's break down how to solve your two Python/pandas problems with clear, actionable code tailored to your DataFrame.

1. Identifying & Processing Date Structures

First off, your just_dates column looks like string-formatted dates. To work with weeks and date-based logic, we need to convert this column to pandas' datetime type first—this unlocks all the date-specific tools we need.

Step 1: Convert to Datetime Type

Use pd.to_datetime() to parse the strings into proper datetime objects. Pandas will automatically infer most standard date formats, but you can specify a format explicitly if you want better performance:

import pandas as pd

# Convert the date column to datetime (auto-infer format)
df['just_dates'] = pd.to_datetime(df['just_dates'], infer_datetime_format=True)

# Verify the conversion worked
print(df['just_dates'].dtype)  # Should output `datetime64[ns]`

If your dates follow a strict format (like YYYY-MM-DD), add format='%Y-%m-%d' to the pd.to_datetime() call to speed things up.

Step 2: Extract Week Information

Once we have datetime objects, we can pull out year and week numbers (using ISO standard, where weeks start on Monday) to group data by week later:

# Add year and week columns (ISO standard)
df['year'] = df['just_dates'].dt.isocalendar().year
df['week'] = df['just_dates'].dt.isocalendar().week

2. Check Weekly Activity (At Least 2 Active Days) + Fault Tolerance

Now let's build the logic to check if each week has at least 2 active days, plus a way to exempt specific time periods from this requirement.

Step 1: Calculate Weekly Active Days

First, group the data by year and week to count how many active days each week has:

# Group by year + week, count active days per week
weekly_activity = df.groupby(['year', 'week'])['just_dates'].count().reset_index(name='active_days')

# Initial check: does the week meet the 2+ active days requirement?
weekly_activity['meets_requirement'] = weekly_activity['active_days'] >= 2

Step 2: Add Fault Tolerance for Specific Periods

Let's implement two common ways to add exceptions: exempting specific weeks, or exempting a date range.

Option 1: Exempt Specific Weeks

Define a list of weeks (as (year, week) tuples) that don't need to meet the 2-day requirement, then adjust the meets_requirement flag:

# Define weeks to exempt (example: 2017 week 23, your "second-to-last week")
fault_tolerant_weeks = [(2017, 23)]

# Mark which weeks are exempt
weekly_activity['is_fault_tolerant'] = weekly_activity.apply(
    lambda row: (row['year'], row['week']) in fault_tolerant_weeks, axis=1
)

# Update the requirement check: exempt weeks automatically pass
weekly_activity['meets_requirement'] = weekly_activity.apply(
    lambda row: True if row['is_fault_tolerant'] else (row['active_days'] >= 2),
    axis=1
)

Option 2: Exempt a Date Range

If you need to exempt a specific date window (like a holiday period), calculate the start/end of each week and check if it overlaps with your exempt range:

# Calculate start and end dates for each week (ISO: Monday to Sunday)
weekly_activity['week_start'] = weekly_activity.apply(
    lambda row: pd.to_datetime(f"{row['year']}-W{row['week']}-1", format='%G-W%V-%u'),
    axis=1
)
weekly_activity['week_end'] = weekly_activity['week_start'] + pd.Timedelta(days=6)

# Define your exempt date range
fault_tolerant_start = pd.to_datetime('2017-06-01')
fault_tolerant_end = pd.to_datetime('2017-06-03')

# Check if the week overlaps with the exempt range
weekly_activity['is_fault_tolerant'] = weekly_activity.apply(
    lambda row: (row['week_start'] <= fault_tolerant_end) & (row['week_end'] >= fault_tolerant_start),
    axis=1
)

# Update the requirement check
weekly_activity['meets_requirement'] = weekly_activity.apply(
    lambda row: True if row['is_fault_tolerant'] else (row['active_days'] >= 2),
    axis=1
)

Step 3: Merge Results Back to Original DataFrame

If you want each row in your original df to show whether its week meets the requirement (or is exempt), merge the weekly results back:

df = df.merge(
    weekly_activity[['year', 'week', 'meets_requirement', 'is_fault_tolerant']],
    on=['year', 'week'],
    how='left'
)

Verify Your Example

For your sample data:

  • The first week (2015 week 23) has 5 active days → meets_requirement=True
  • The second-to-last week (2017 week 23) has 1 active day → if marked as exempt, meets_requirement=True; otherwise False
  • The last week has 3 active days → meets_requirement=True

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:11:40