如何为Pandas DataFrame中城市匹配时区并判定团队协作定位类型
城市转时区及团队协作类型判定方案
一、城市转时区的实现方法
你可以通过构建城市-时区映射字典结合Pandas完成时区推导,针对你给出的固定城市列表,直接映射比调用复杂地理库更高效。
先补全城市-时区对应关系(结合你提供的城市-国家编码):
| 城市名称 | 城市-国家编码 | 对应时区(pytz格式) |
|---|---|---|
| 纽约 | 纽约 - US | America/New_York |
| 孟买 | 孟买 - IN | Asia/Kolkata |
| 凤凰城 | 凤凰城 - US | America/Phoenix |
| 日出城 | 日出城 - US | America/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)
运行后即可得到你需要的城市-时区对应格式。
二、团队协作类型判定
根据你提出的三个规则,通过自定义函数实现判定:
核心逻辑
- 同地协作团队:产品负责人、Scrum Master、开发人员的城市完全一致
- 部分同地协作团队:城市不完全相同,但至少有两个时区的工作时间存在重叠(以9:00-17:00本地工作时间为标准)
- 非同地协作团队:三个时区的工作时间完全无重叠
代码实现判定逻辑
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_York | Asia/Kolkata | America/Phoenix | 非同地协作团队 |
| 团队B | 纽约 | 纽约 | 纽约 | America/New_York | America/New_York | America/New_York | 同地协作团队 |
| 团队C | 纽约 | 日出城 | 凤凰城 | America/New_York | America/New_York | America/Phoenix | 部分同地协作团队 |
内容的提问来源于stack exchange,提问作者Leo82
相关产品推荐
相关产品推荐

