如何根据 24 小时轴 (00:00 - 23:59:59) 绘制每日数据

2024-01-12

我有一个包含 date_time、日期、时间和 VALUE1 列的数据集,该列显示每个时间点的测量值。对于同一个 ID,一天内会有多次测量。此外,一个 ID 有 6 种不同的 24 小时测量值,显示在 INSPECTION 栏中。

import random
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.ticker as ticker

random.seed(0)

df = pd.DataFrame({'DATE_TIME': pd.date_range('2022-11-01', '2022-11-06 23:00:00', freq='20min'),
                   'ID': [random.randrange(1, 3) for n in range(430)]})
df['VALUE1'] = [random.uniform(110, 160) for n in range(430)]
df['VALUE2'] = [random.uniform(50, 80) for n in range(430)]
df['INSPECTION'] = df['DATE_TIME'].dt.day
# df['INSPECTION'] = df['INSPECTION'].replace(6, 1)
# df['INSPECTION'] = df['INSPECTION'].replace(3, 1)

df['MODE'] = np.select([df['INSPECTION'] == 1, df['INSPECTION'].isin([2, 3])], ['A', 'B'], 'C')
df['TIME'] = df['DATE_TIME'].dt.time
df['TIME'] = df['TIME'].astype('str')

df['TIMEINTERVAL'] = df.DATE_TIME.diff().astype('timedelta64[m]')
df['TIMEINTERVAL'] = df['TIMEINTERVAL'].fillna(0)


def to_day_period(s):
    bins = ['0', '06:00:00', '13:00:00', '18:00:00', '23:00:00', '24:00:00']
    labels = ['Nighttime', 'Daytime', 'Daytime', 'Nighttime', 'Nighttime']

    return pd.cut(
        pd.to_timedelta(s),
        bins=list(map(pd.Timedelta, bins)),
        labels=labels, right=False, ordered=False
    )


df['TIME_OF_DAY'] = to_day_period(df['TIME'])
df_monthly = df

# ++++++++++++++++++++++++++++++++ sns plot ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
df_id = df[df.ID==1]
sns.set_style('darkgrid')
sns.set(rc={'figure.figsize':(14,8)})
#print(df_id.INSPECTION.unique())
ax = sns.lineplot(data=df_id, x ='TIME', y = 'VALUE1',
                  hue='INSPECTION', palette='viridis',
                  legend='full', lw=3)

ax.xaxis.set_major_locator(ticker.MultipleLocator(10))
plt.legend(bbox_to_anchor=(1, 1))
plt.ylabel('VALUE1')
plt.xlabel('TIME')
plt.show()

如何在 x 轴上显示 24 小时的一天周期而不再次重复时间?为了表达清楚,x 轴从 00:40:00 开始,然后再次显示 00:00:00。也有办法解决这个问题吗?我只想在 x 轴上显示从 00:00:00 到 23:59:00 的时间,而不重复时间。


  • Create a column representing the total number of seconds for a given day, which will be used as the x-axis, and will ensure every point for a given 'INSPECTION' is properly positioned.
    • 给定特定日期,从当前日期时间中减去午夜的日期,然后使用.total_seconds() https://pandas.pydata.org/docs/reference/api/pandas.Series.dt.total_seconds.html method.
    • df.DATE_TIME.apply(lambda row: (row - row.replace(hour=0, minute=0, second=0, microsecond=0)).total_seconds())
  • Set ticks to be every hour.
    • ax.xaxis.set_major_locator(tkr.MultipleLocator(3600))
  • Create a list of every hour, which will be used as the labels. [''] is for the last tick at '00:00' of the next day.
    • hours = [dtime(i).strftime('%H:%M') for i in range(24)] + ['']
  • This can also be done with fig, (ax1, ax2) = plt.subplots(2, 1), but that's a cosmetic change that's not relevant to the question.
    • See 如何绘制多个子图 https://stackoverflow.com/a/69228859/7758804有关在子图中绘制的更多详细信息。
  • 一个海上传奇应该与sns.move_legend, not plt.legend, 按照将seaborn图例移动到不同的位置 https://stackoverflow.com/a/68849891/7758804.
  • 坚持使用面向对象的接口更加一致ax,别名为matplotlib.axes.Axes https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.html,而不是在之间交替ax and plt.
  • 测试于python 3.11.2, pandas 2.0.0, matplotlib 3.7.1, seaborn 0.12.2
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as tkr
from datetime import time as dtime

# given the existing dataframe with the DATE_TIME column as a datetime Dtype

# add a column for total seconds
df['total_seconds'] = df.DATE_TIME.apply(lambda row: (row - row.replace(hour=0, minute=0, second=0, microsecond=0)).total_seconds())

# iterate through each ID
for id_ in sorted(df.ID.unique()):
    
    # select the data for the given id_
    data = df[df.ID.eq(id_)]

    # create a figure
    fig = plt.figure(figsize=(10, 6))

    # plot the data
    ax = sns.lineplot(data=data, x ='total_seconds', y = 'VALUE1', hue='INSPECTION', palette='viridis', legend='full')
    
    # set the title and labels
    ax.set(title=f'ID: {id_}', xlabel='TIME', ylabel='VALUE1')
    
    # move the legend
    sns.move_legend(ax, bbox_to_anchor=(1.0, 0.5), loc='center left', frameon=False)

    # constrain the x-axis limits to the number of seconds in a day
    ax.set_xlim(0, 24*3600)

    # create labels for every hour in the day, and add an extra spot for the last tick position
    hours = [dtime(i).strftime('%H:%M') for i in range(24)] + ['']

    # create xticks at every hour
    ax.xaxis.set_major_locator(tkr.MultipleLocator(3600))
    
    # set the ticks and corresponding labels; cut off extra starting and ending ticks to match labels
    ax.set_xticks(ticks=ax.get_xticks()[1:-1], labels=hours, rotation=90)
    
    # remove spines
    ax.spines[['top', 'right']].set_visible(False)

df.head()

            DATE_TIME  ID      VALUE1     VALUE2  INSPECTION MODE      TIME    TIMEINTERVAL  total_seconds TIME_OF_DAY
0 2022-11-01 00:00:00   2  145.003985  57.488269           1    A  00:00:00             NaT            0.0   Nighttime
1 2022-11-01 00:20:00   2  142.449613  75.888882           1    A  00:20:00 0 days 00:20:00         1200.0   Nighttime
2 2022-11-01 00:40:00   1  119.748681  70.052981           1    A  00:40:00 0 days 00:20:00         2400.0   Nighttime
3 2022-11-01 01:00:00   2  149.170848  69.793085           1    A  01:00:00 0 days 00:20:00         3600.0   Nighttime
4 2022-11-01 01:20:00   2  148.873049  56.777515           1    A  01:20:00 0 days 00:20:00         4800.0   Nighttime
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据 24 小时轴 (00:00 - 23:59:59) 绘制每日数据 的相关文章

随机推荐

  • 使用 awk sed 解析更新 puppet 文件

    我有一个包含多行代码的木偶文件 其中有一个部分如下所示 defaultrepo myrepo defaultbranch mybranch gitmod pullstuff othergitcode gitcommit gt b54123b
  • 为什么 C++20 中 unique_ptr 不是 equal_comparable_with nullptr_t ?

    使用 C 20concept我注意到std unique ptr似乎无法满足std equality comparable with
  • 转置 data.table

    数据计算结束后有效转换 data table 的好方法是什么 nrow 500e3 ncol 2000 m lt matrix rnorm nrow ncol nrow nrow colnames m lt c foo seq ncol 1
  • 还原并反应不需要的效果

    大家好 我正在尝试使用 redux 来制作购物车功能 2 问题描述 问题是 一旦我想从我的购物篮中删除不是最后一个的产品 Redux 确实从商店中删除了所需的产品 但在前端我仍然可以看到该产品 并且 React 会从列表中删除最后一个产品
  • 用于语义相似性的 BERT 嵌入

    我之前发布过这个question https stackoverflow com questions 60767089 bert get sentence level embedding after fine tuning 我想获得与此类似
  • 为什么要使用 Mockito? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 Mockito 的新手 我已经开始学习它了 但我有一些问题 为什么我们需要使用 Mockito 据我所知 它用于模拟 创建虚拟对
  • 我可以指望这个 ASP.NET 事件日志源始终被注册吗?

    未处理的异常导致基于 ASP NET 的应用程序在 NET Framework 2 0 中意外退出 http support microsoft com id 911816让我认为使用以下约定命名的事件日志源将始终在安装了 NET Fram
  • Spring 与 Spring Boot 集成 SFTP 示例

    我们正在为 Spring 应用程序使用最新的 Spring Boot 并为 SFTP 使用最新的 Spring Integration 我访问过 Spring Integration SFTP 文档站点 并按原样采用了 Spring Boo
  • Thread.sleep() 永远不会返回

    我有一个奇怪的错误Thread sleep 关于Java 由于某种原因 当我在某些机器上调用 sleep 时 它永远不会返回 我无法弄清楚是什么导致了这种行为 起初 我认为错误可能在我的代码中的其他地方 所以我做了最简单的睡眠测试 publ
  • 卡托皮县的县边界

    如何在 Cartopy 中绘制美国县边界 绘制州和国家边界非常简单 ax add feature cfeature BORDERS with scale 50m ax add feature cfeature STATES with sca
  • CakePHP 会话 ID 路径或其他共享 url 结果的方法 - 欢迎推荐

    我正在寻找有关合理的 Cake 方法的建议 以创建基于会话 id 的 url 我可以与其他人共享该 URL 以查看与我所看到的相同的搜索结果 我知道在标准 php 中 我只需获取会话 id 并将其传递给 url 但我猜测 Cake 可能有一
  • javascript选择输入事件

    我正在尝试从 javascript 创建一个选择输入 并在用户更改选项时绑定一个函数 到目前为止我有 filter change function console log CHANGED 但选择其他东西后什么也不会发生 这段代码有什么问题
  • 为什么 PHP 开发人员无法根据线程范围提供 setlocale 函数

    We have 设置语言环境 http php net manual en function setlocale phpPHP 中的函数 该函数有警告信息 区域设置信息是按进程维护的 而不是按线程维护的 如果您在多线程服务器 API 例如
  • 如何阻止任何滑块向 URL 添加主题标签

    任何滑块都会添加哈希标签 例如 panel1 1在网址末尾 I tried hashtags false但它不起作用 有没有其他方法可以阻止它生成这些主题标签 尝试将其更改为hashTags false 注意标签中的大写 T
  • 如何使用 podfile 中的源?

    我是ios开发新手 由于某种原因 我需要为我的 Cordova 应用程序手动设置 podfile 有GoogleCloudMessaging and GGLInstanceID在我的podfile中 现在我想安装一个brightcove视频
  • 用于多重虚拟继承和类型转换的虚拟表和虚拟指针

    我对 vptr 和内存中对象的表示有点困惑 希望你能帮助我更好地理解这个问题 考虑B继承自A并且都定义了虚函数f 据我所知 B类对象在内存中的表示如下 vptr A B 和vtbl that vptr指向包含B f 我还了解到从B to A
  • 头盔 CSP 无法正常工作?

    使用 Express 分发的 Vue SPA 这是我在快递中的头盔代码 app use helmet contentSecurityPolicy directives defaultSrc self styleSrc self unsafe
  • 为什么需要未对齐的 apk?

    Android gradle 以两个二进制文件生成 apk 未对齐和对齐 The document http developer android com tools publishing app signing html said 使用私钥
  • 从 Python 编写 LMMS 脚本

    最近我asked https stackoverflow com questions 267628 scripting fruityloops or propellerheads reason from vb or python关于从 Py
  • 如何根据 24 小时轴 (00:00 - 23:59:59) 绘制每日数据

    我有一个包含 date time 日期 时间和 VALUE1 列的数据集 该列显示每个时间点的测量值 对于同一个 ID 一天内会有多次测量 此外 一个 ID 有 6 种不同的 24 小时测量值 显示在 INSPECTION 栏中 impor