如何在含时间戳的字典列表中设置每日首个时间点的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
相关产品推荐
相关产品推荐

