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

如何在含时间戳的字典列表中设置每日首个时间点的km值为0?

问题描述

我有如下格式的字典列表:

from datetime import datetime

data = [
    {"Zeit": datetime(2024, 2, 27, 8, 0), "km": 10},
    {"Zeit": datetime(2024, 2, 27, 13, 30), "km": 20},
    {"Zeit": datetime(2024, 2, 27, 17, 30), "km": 40},
    {"Zeit": datetime(2024, 2, 28, 9, 15), "km": 15},
    {"Zeit": datetime(2024, 2, 28, 14, 45), "km": 25}
]

希望找到每天的第一个时间条目,并将其km值设为0,处理后结果如下:

data = [
    {"Zeit": datetime(2024, 2, 27, 8, 0), "km": 0},
    {"Zeit": datetime(2024, 2, 27, 13, 30), "km": 20},
    {"Zeit": datetime(2024, 2, 27, 17, 30), "km": 40},
    {"Zeit": datetime(2024, 2, 28, 9, 15), "km": 0},
    {"Zeit": datetime(2024, 2, 28, 14, 45), "km": 25}
]
解决方案

方法1:基础循环跟踪日期

遍历列表,记录已处理的日期,遇到新日期的第一个条目就修改km为0,简单直接无额外依赖:

from datetime import datetime

data = [
    {"Zeit": datetime(2024, 2, 27, 8, 0), "km": 10},
    {"Zeit": datetime(2024, 2, 27, 13, 30), "km": 20},
    {"Zeit": datetime(2024, 2, 27, 17, 30), "km": 40},
    {"Zeit": datetime(2024, 2, 28, 9, 15), "km": 15},
    {"Zeit": datetime(2024, 2, 28, 14, 45), "km": 25}
]

processed_dates = set()
for entry in data:
    # 提取日期部分(忽略时分秒)
    date_key = entry["Zeit"].date()
    if date_key not in processed_dates:
        entry["km"] = 0
        processed_dates.add(date_key)

# 查看处理结果
for item in data:
    print(f"{item['Zeit']}: km={item['km']}")

方法2:用itertools.groupby分组处理

先按日期分组,每组的第一个条目修改km值,适合有分组需求的场景:

from datetime import datetime
from itertools import groupby

data = [
    {"Zeit": datetime(2024, 2, 27, 8, 0), "km": 10},
    {"Zeit": datetime(2024, 2, 27, 13, 30), "km": 20},
    {"Zeit": datetime(2024, 2, 27, 17, 30), "km": 40},
    {"Zeit": datetime(2024, 2, 28, 9, 15), "km": 15},
    {"Zeit": datetime(2024, 2, 28, 14, 45), "km": 25}
]

# 注意:groupby要求数据先按分组键排序,若原数据无序先执行排序:
# data.sort(key=lambda x: x["Zeit"])

for date, group in groupby(data, key=lambda x: x["Zeit"].date()):
    entries = list(group)
    entries[0]["km"] = 0

# 查看处理结果
for item in data:
    print(f"{item['Zeit']}: km={item['km']}")

方法3:Pandas处理(适合大规模数据)

数据量较大时,用Pandas的分组和变换功能效率更高:

from datetime import datetime
import pandas as pd

data = [
    {"Zeit": datetime(2024, 2, 27, 8, 0), "km": 10},
    {"Zeit": datetime(2024, 2, 27, 13, 30), "km": 20},
    {"Zeit": datetime(2024, 2, 27, 17, 30), "km": 40},
    {"Zeit": datetime(2024, 2, 28, 9, 15), "km": 15},
    {"Zeit": datetime(2024, 2, 28, 14, 45), "km": 25}
]

df = pd.DataFrame(data)
# 标记每组的第一个条目
df["is_first"] = df.groupby(df["Zeit"].dt.date)["Zeit"].transform(lambda x: x == x.min())
# 将第一个条目的km设为0
df.loc[df["is_first"], "km"] = 0
# 转回字典列表
processed_data = df.to_dict("records")

# 查看处理结果
for item in processed_data:
    print(f"{item['Zeit']}: km={item['km']}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:38:25