如何将Datetime字符串列表优雅转换为小时分布DataFrame
嘿,这个需求用 pandas 的交叉表(crosstab)或者透视表(pivot_table)就能轻松搞定,完全不用写一堆繁琐的 if-else!我给你一步步演示最优雅的实现方式:
步骤1:将原始数据转换为 pandas DataFrame
先把你的 datetime 字符串列表转换成 pandas 能处理的结构,顺便提取出日期和小时字段:
import pandas as pd # 你的原始时间字符串列表 dt_list = ['2021-06-18 14:39:54', '2021-06-18 08:30:26', '2021-06-18 15:07:12', '2021-06-18 13:13:29', '2021-06-18 11:27:48', '2021-06-19 09:25:26', '2021-06-19 16:14:38', '2021-06-19 13:41:31', '2021-06-19 15:09:42', '2021-06-19 03:24:29'] # 直接用 pd.to_datetime 批量转换,生成DataFrame df = pd.DataFrame({'datetime': pd.to_datetime(dt_list)}) # 提取日期(不带时间)和小时数 df['date'] = df['datetime'].dt.date df['hour'] = df['datetime'].dt.hour
步骤2:用交叉表生成小时分布
pd.crosstab 会自动帮我们按日期和小时分组计数,缺失的小时直接用 fill_value=0 补全,完美匹配你要的格式:
# 生成基础的小时分布表 hour_dist = pd.crosstab(df['date'], df['hour'], fill_value=0) # 如果你需要严格包含0到24的列(注意:实际小时范围是0-23,24列可以保留为0) all_hours = range(0, 25) hour_dist = hour_dist.reindex(columns=all_hours, fill_value=0) # 转换成你示例中的格式(重置索引让date成为普通列) result_df = hour_dist.reset_index() print(result_df)
运行后输出的结果就和你期望的完全一致啦:
hour date 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 0 2021-06-18 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 2021-06-19 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
替代方案:用透视表实现
如果你更喜欢用 pivot_table,效果是一样的:
hour_dist = df.pivot_table(index='date', columns='hour', aggfunc='size', fill_value=0) hour_dist = hour_dist.reindex(columns=all_hours, fill_value=0) result_df = hour_dist.reset_index()
这两种方法都比手动写 if-else 高效太多,而且代码可读性强,后续扩展也方便~
内容的提问来源于stack exchange,提问作者Aezak
相关产品推荐
相关产品推荐

