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

如何为Pandas DataFrame中城市匹配时区并判定团队协作定位类型

城市转时区及团队协作类型判定方案

一、城市转时区的实现方法

你可以通过构建城市-时区映射字典结合Pandas完成时区推导,针对你给出的固定城市列表,直接映射比调用复杂地理库更高效。

先补全城市-时区对应关系(结合你提供的城市-国家编码):

城市名称城市-国家编码对应时区(pytz格式)
纽约纽约 - USAmerica/New_York
孟买孟买 - INAsia/Kolkata
凤凰城凤凰城 - USAmerica/Phoenix
日出城日出城 - USAmerica/New_York

代码实现时区转换

import pandas as pd
import numpy as np
import pytz

# 初始DataFrame(转写为中文列名)
df = pd.DataFrame({
    '团队名称': np.random.choice(['团队A','团队B','团队C','团队D','团队E','团队F'], 6, replace=False),
    '产品负责人城市': np.random.choice(['纽约','孟买','凤凰城','日出城'], 6),
    'Scrum Master城市': np.random.choice(['纽约','孟买','凤凰城','日出城'], 6),
    '开发人员城市': np.random.choice(['纽约','孟买','凤凰城','日出城'], 6)
})

# 构建城市到时区的映射字典
city_to_tz = {
    '纽约': pytz.timezone('America/New_York'),
    '孟买': pytz.timezone('Asia/Kolkata'),
    '凤凰城': pytz.timezone('America/Phoenix'),
    '日出城': pytz.timezone('America/New_York')
}

# 生成时区列(可选择显示时区名称字符串)
df['产品负责人时区'] = df['产品负责人城市'].map(city_to_tz).astype(str)
df['Scrum Master时区'] = df['Scrum Master城市'].map(city_to_tz).astype(str)
df['开发人员时区'] = df['开发人员城市'].map(city_to_tz).astype(str)

运行后即可得到你需要的城市-时区对应格式。

二、团队协作类型判定

根据你提出的三个规则,通过自定义函数实现判定:

核心逻辑

  1. 同地协作团队:产品负责人、Scrum Master、开发人员的城市完全一致
  2. 部分同地协作团队:城市不完全相同,但至少有两个时区的工作时间存在重叠(以9:00-17:00本地工作时间为标准)
  3. 非同地协作团队:三个时区的工作时间完全无重叠

代码实现判定逻辑

def judge_collab_type(row):
    # 规则1:三个城市完全一致
    if row['产品负责人城市'] == row['Scrum Master城市'] == row['开发人员城市']:
        return '同地协作团队'
    
    # 获取三个时区对象
    tz_map = {v: pytz.timezone(v) for v in set([row['产品负责人时区'], row['Scrum Master时区'], row['开发人员时区']])}
    unique_tzs = [tz_map[row['产品负责人时区']], tz_map[row['Scrum Master时区']], tz_map[row['开发人员时区']]]
    
    # 计算本地工作时间对应的UTC时间窗
    def get_utc_work_window(tz):
        local_start = pd.Timestamp('09:00').tz_localize(tz)
        local_end = pd.Timestamp('17:00').tz_localize(tz)
        return (local_start.tz_convert('UTC'), local_end.tz_convert('UTC'))
    
    work_windows = [get_utc_work_window(tz) for tz in unique_tzs]
    has_overlap = False
    
    # 两两检查时间窗是否有交集
    for i in range(len(work_windows)):
        for j in range(i+1, len(work_windows)):
            s1, e1 = work_windows[i]
            s2, e2 = work_windows[j]
            if not (e1 <= s2 or e2 <= s1):
                has_overlap = True
                break
        if has_overlap:
            break
    
    return '部分同地协作团队' if has_overlap else '非同地协作团队'

# 为每一行添加协作类型判定结果
df['协作类型'] = df.apply(judge_collab_type, axis=1)

三、最终结果示例

处理后的DataFrame示例如下:

团队名称产品负责人城市Scrum Master城市开发人员城市产品负责人时区Scrum Master时区开发人员时区协作类型
团队A纽约孟买凤凰城America/New_YorkAsia/KolkataAmerica/Phoenix非同地协作团队
团队B纽约纽约纽约America/New_YorkAmerica/New_YorkAmerica/New_York同地协作团队
团队C纽约日出城凤凰城America/New_YorkAmerica/New_YorkAmerica/Phoenix部分同地协作团队

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:55:33