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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:37:34