【问题标题】:Python: plotting time series data with two dependent date columnsPython:用两个相关日期列绘制时间序列数据
【发布时间】:2018-03-05 12:56:46
【问题描述】:

我是一个 Python 新手,我已经在谷歌上搜索了大约一个小时,似乎无法到达任何地方 - 以前有没有人遇到过这种问题并设法解决了它?

我正在尝试跨两个相关的日期字段绘制具有 1 个指标的时间序列数据集。例如,A 列是日期,B 列是该日期内的时间片(序数)

这是我的数据示例。

        date         period         variable
2 2016-08-01  00:00 - 00:30         1
3 2016-08-01  00:30 - 01:00         2
4 2016-08-01  01:00 - 01:30         3
5 2016-08-01  01:30 - 02:00         4
6 2016-08-01  02:00 - 02:30         5

所以我希望我的 x 轴显示 A 列和 B 列的组合,C 列在我的 y 轴上。

有什么想法吗?

【问题讨论】:

  • 你能把日期和时间段组合成一个你想要的格式的字符串,然后用它作为刻度标签吗?
  • 如果我这样做了,它是否仍会将其视为序数标签并以正确的顺序绘制我的日期?
  • 在 matplotlib 中,您可以通过创建一个连续整数/数字列表用作 x 数据然后使用文本作为刻度标签来解决这个问题。 the Gallery 中有示例。在 SO 上也有使用该方法的问答。

标签: python matplotlib data-visualization bokeh seaborn


【解决方案1】:

我认为您必须将日期和期末结合为时间戳,然后在散点图上绘制时间戳与您的值。

如果周期的持续时间对您很重要,那么您可以为每个观察创建两个数据点,周期的开始和结束,并将它们与线段连接起来。这样您就不会丢失有关周期长度的信息。

【讨论】:

    【解决方案2】:

    最简单的解决方案当然取决于数据的来源。由于我们没有这些信息,让我们从一些日期为字符串的列表开始。

    import pandas as pd
    import matplotlib.pyplot as plt
    a = [["2016-08-01",  "00:00 - 00:30",1],
         ["2016-08-01",  "00:30 - 01:00",2],
         ["2016-08-01",  "01:00 - 01:30",3],
         ["2016-08-01",  "01:30 - 02:00",4],
         ["2016-08-01",  "02:00 - 02:30",5]]
    df = pd.DataFrame(a, columns=["date", "period", "variable"])
    # split "period" column into start and stop
    df['starttime'], df['stoptime'] = df['period'].str.split(' - ', 1).str
    # create new column with date and starttime
    df["datetime"] = pd.to_datetime(df['date'] + ' ' + df['starttime'])
    #create new dataframe with datetime as index and variable as only column
    df2 = df[["datetime","variable"]]
    df2.set_index("datetime",inplace=True)
    
    #plot step function
    df2.plot(drawstyle="steps-post")
    
    plt.tight_layout()
    plt.show()
    

    【讨论】:

    • 谢谢 - 我希望这是解决方案,但我的数据有一些错误('未知字符串格式') - 我会在修复它们后报告!
    • 是的,我假设前两列是字符串。如果他们不是,这将不起作用。但是由于您没有提供有关列数据类型的信息,因此这是我的最佳猜测。我们掌握的信息越多,提供准确解决方案的机会就越大。
    • 是的,抱歉,我实际上不知道如何提供有关我的数据的详细信息! dtypes 只是将它显示为一个对象,我不知道如何获得更详细的信息。我一直在尝试用谷歌搜索更多信息,但据我所知,它们只是字符串。从表面上看,它看起来与您在上面创建的数据集完全相同。有趣的是,它适用于前 20 行数据,因此列内肯定存在一些不一致。
    • df.info() 为您提供一些信息。否则,要走的路可能会从您将数据读入熊猫的地方开始。它从何而来?它是如何读入的?
    • 它似乎适用于前 400k 行,但不能超出此范围 - 所以不能是格式,而是数据本身的内容。这是一个通过 pandas csv reader 输入的 csv。 Data columns (total 6 columns): date 977324 non-null object period 977326 non-null object var1 977327 non-null float64 var2 977327 non-null float64 starttime 977326 non-null object stoptime 977325 non-null object
    【解决方案3】:

    Matplotlib:

    y 数据:

    >>> var
    [1, 2, 3, 4, 5]
    

    制作文字标签

    >>> labels
    ['2016-08-01#00:00 - 00:30', '2016-08-01#00:30 - 01:00','2016-08-01#01:00 - 01:30',
     '2016-08-01#01:30 - 02:00', '2016-08-01#02:00 - 02:30']
    

    为绘图创建 x 值

    >>> x = list(range(len(labels)))
    >>> x
    [0, 1, 2, 3, 4]
    

    绘制 x 和 y,为 x-ticks 分配标签

    from matplotlib import pyplot as plt
    plt.plot(x, var)
    plt.xticks(x, labels, rotation='vertical')
    

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 1970-01-01
      • 2023-04-08
      • 2021-05-18
      • 2019-11-22
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多