基于时间序列data_time值的列值迁移实现方案咨询
需求说明
初始数据
我们有如下初始DataFrame:
| Date_time | Universe_Location_1 | Universe_Location_2 | Universe_Location_3 | Universe_Location_4 |
|---|---|---|---|---|
| 20.06.2023 11:00 | Saturn | mars | earth |
天体移动规则
- Saturn每30分钟从一个位置移动到下一个位置
- Mars每45分钟从一个位置移动到下一个位置
- Earth每60分钟从一个位置移动到下一个位置
输入输出示例
示例输入1:20.06.2023 11:30
对应的结果DataFrame:
| Date_time | Universe_Location_1 | Universe_Location_2 | Universe_Location_3 | Universe_Location_4 |
|---|---|---|---|---|
| 20.06.2023 11:30 | Saturn | mars | earth |
示例输入2:20.06.2023 11:45
对应的结果DataFrame:
| Date_time | Universe_Location_1 | Universe_Location_2 | Universe_Location_3 | Universe_Location_4 |
|---|---|---|---|---|
| 20.06.2023 11:45 | Saturn | mars earth |
示例输入3:20.06.2023 12:00
对应的结果DataFrame:
| Date_time | Universe_Location_1 | Universe_Location_2 | Universe_Location_3 | Universe_Location_4 |
|---|---|---|---|---|
| 20.06.2023 12:00 | Earth | Saturn | mars |
技术实现建议
步骤1:计算时间差
将初始时间和目标时间转换为datetime对象,算出两者的总分钟数差值,记为total_minutes。
步骤2:统计天体移动次数
根据各天体的移动周期,计算移动次数:
- Saturn移动次数:
saturn_moves = total_minutes // 30 - Mars移动次数:
mars_moves = total_minutes // 45 - Earth移动次数:
earth_moves = total_minutes // 60
步骤3:明确位置循环规则
天体在4个位置(Universe_Location_1至4)按位置1→2→3→4→1的顺序循环移动:
- 初始位置:Saturn在位置1,Mars在位置3,Earth在位置4
- 若多个天体移动到同一位置,用空格拼接名称(如示例2中Mars和Earth同处位置4,显示为"mars earth")
步骤4:实现位置计算逻辑
对每个天体,按以下步骤计算目标位置:
- 将位置映射为索引(位置1=0,位置2=1,位置3=2,位置4=3)
- 目标索引 = (初始索引 + 移动次数) % 4
- 将索引转回对应的位置列名
步骤5:构建结果DataFrame
- 初始化结果行,所有位置列先设为空字符串
- 把每个天体的名称填入计算出的目标位置列:若目标位置已有内容,追加空格和天体名称
- 填入目标时间,生成最终的DataFrame
代码实现示例(Python)
import pandas as pd from datetime import datetime # 初始数据 initial_data = { "Date_time": ["20.06.2023 11:00"], "Universe_Location_1": ["Saturn"], "Universe_Location_2": [""], "Universe_Location_3": ["mars"], "Universe_Location_4": ["earth"] } initial_df = pd.DataFrame(initial_data) # 天体初始位置(列名→索引映射) planet_initial_pos = { "Saturn": 0, "mars": 2, "earth": 3 } # 索引→列名映射 pos_to_col = { 0: "Universe_Location_1", 1: "Universe_Location_2", 2: "Universe_Location_3", 3: "Universe_Location_4" } # 天体移动周期(分钟) planet_cycles = { "Saturn": 30, "mars": 45, "earth": 60 } def generate_result(target_time_str): # 时间格式转换 time_format = "%d.%m.%Y %H:%M" initial_time = datetime.strptime(initial_df["Date_time"].iloc[0], time_format) target_time = datetime.strptime(target_time_str, time_format) total_minutes = int((target_time - initial_time).total_seconds() // 60) # 初始化结果行 result_row = { "Date_time": target_time_str, "Universe_Location_1": "", "Universe_Location_2": "", "Universe_Location_3": "", "Universe_Location_4": "" } # 计算每个天体的目标位置并填充 for planet, initial_idx in planet_initial_pos.items(): cycle = planet_cycles[planet] move_count = total_minutes // cycle target_idx = (initial_idx + move_count) % 4 target_col = pos_to_col[target_idx] if result_row[target_col]: result_row[target_col] += f" {planet}" else: result_row[target_col] = planet return pd.DataFrame([result_row]) # 测试示例 print(generate_result("20.06.2023 11:30")) print(generate_result("20.06.2023 11:45")) print(generate_result("20.06.2023 12:00"))
内容的提问来源于stack exchange,提问作者Vivek kanna Jayaprakash
相关产品推荐
相关产品推荐

