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

如何处理跨午夜且日期相同的Pandas时间戳索引DataFrame绘图问题

解决夜间跨天传感器数据的Matplotlib绘图问题

这个跨天时间绘图的坑我之前也踩过!两种方案都能完美解决你的问题,咱们一个个说:

方案一:忽略日期,直接按时间顺序绘图

如果不想修改日期,我们可以把时间转换成当日累计秒数,然后对凌晨的时间手动加上一天的秒数(86400秒),这样就能保证23:30到次日02:30的时间顺序是正确的。

步骤代码:

import pandas as pd
import matplotlib.pyplot as plt

# 先修正你原来的date_parser格式错误:把'H%:%M:%S:%f'改成'%H:%M:%S:%f',%H是小时的正确格式符
df = pd.read_csv('your_data.csv', parse_dates=['timestamp'], 
                 date_parser=lambda x: pd.datetime.strptime(x, '%H:%M:%S:%f'))

# 计算每个时间戳从当日0点开始的累计秒数(包含毫秒)
df['time_seconds'] = (df['timestamp'].dt.hour * 3600 + 
                      df['timestamp'].dt.minute * 60 + 
                      df['timestamp'].dt.second + 
                      df['timestamp'].dt.microsecond / 1e6)

# 设定你的时间起始点:23:30:00对应的累计秒数是23*3600 + 30*60 = 84600
start_seconds = 23 * 3600 + 30 * 60

# 对凌晨的时间(累计秒数小于起始点)加上一天的秒数,保证顺序正确
df['adjusted_seconds'] = df['time_seconds'].apply(lambda x: x + 86400 if x < start_seconds else x)

# 按修正后的秒数排序,然后绘图
df_sorted = df.sort_values('adjusted_seconds')

plt.figure(figsize=(10, 6))
plt.plot(df_sorted['adjusted_seconds'], df_sorted['value'])

# 自定义x轴标签,显示易读的时间格式
def seconds_to_time(s):
    if s >= 86400:
        s -= 86400
    hours = int(s // 3600)
    minutes = int((s % 3600) // 60)
    seconds = s % 60
    return f"{hours:02d}:{minutes:02d}:{seconds:.3f}"

# 每隔一定数量的点取一个标签,避免重叠
tick_indices = df_sorted['adjusted_seconds'][::len(df)//10]
plt.xticks(tick_indices, 
           [seconds_to_time(s) for s in tick_indices],
           rotation=45)

plt.xlabel('Time')
plt.ylabel('Sensor Value')
plt.title('Night Sensor Data Over Time')
plt.tight_layout()
plt.show()

方案二:读取CSV时自动为凌晨时间戳加一天

如果你希望保留datetime格式的时间戳,更优雅的方式是在解析时就判断:如果时间早于23:30,就把日期加一天,这样Matplotlib就能正确识别时间顺序了。

步骤代码:

import pandas as pd
import matplotlib.pyplot as plt
from datetime import timedelta

def parse_timestamp(x):
    # 解析时间字符串为datetime对象(默认日期是1900-01-01)
    time_obj = pd.datetime.strptime(x, '%H:%M:%S:%f')
    # 设定时间分界点:23:30:00
    cutoff_time = pd.time(23, 30, 0)
    # 如果当前时间早于分界点,说明是次日的时间,给日期加一天
    if time_obj.time() < cutoff_time:
        time_obj += timedelta(days=1)
    return time_obj

# 使用自定义的解析函数读取CSV
df = pd.read_csv('your_data.csv', parse_dates=['timestamp'], date_parser=parse_timestamp)

# 现在timestamp的日期已经正确:1900-01-01 23:30~23:59,1900-01-02 00:00~02:30
# 直接绘图即可
plt.figure(figsize=(10, 6))
plt.plot(df['timestamp'], df['value'])
plt.xticks(rotation=45)
plt.xlabel('Timestamp')
plt.ylabel('Sensor Value')
plt.title('Night Sensor Data Over Time')
plt.tight_layout()
plt.show()

小提示:

你原来的date_parser里格式字符串写错了,H%:%M:%S:%f应该改成%H:%M:%S:%f——%H是24小时制小时的正确格式符,这个小错误得先修正哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:32:50