简体   繁体   English

如何在 Python 中绘制时间序列数据?

[英]How do I plot timeseries data in Python?

I work with a lot of timeseries data and would love a way to simply plot it seasonally;我使用大量时间序列数据,并且希望有一种方法可以简单地按季节绘制它;

For example;例如;

            A  B  C  D  E  F  G H I
01/01/2008  4  4  43 4  3 4  3  4 3
02/01/2008  43 3  4  3  34  3  4  3
03/01/2008 11 2  3 4  3  4  3 44 3 
.
.
.
07/08/2021 43 3  4  3  34  3  4  3
08/09/2021 43 3  4  3  34  3  4  3

Is there an efficient or python-y way to plot this so that it would resemble a seasonality chart but on daily granularity?是否有一种有效的或 python-y 的方式来绘制它,以便它类似于季节性图表但按每日粒度?

Something that may resemble the below?可能类似于下面的东西?

在此处输入图像描述

Ideally this may also create a dataframe with yearly columns of data with the index being dd/mm date format to also use.理想情况下,这也可以创建一个数据框,其中包含年度数据列,索引为 dd/mm 日期格式,也可以使用。

Any help much appreciated!非常感谢任何帮助!

  • simple in plotly情节简单
  • have simulated your data with random data用随机数据模拟了你的数据
  • key step is an x-axis that is constant across the years for seasonality.关键步骤是一个 x 轴,该轴在多年内保持季节性不变。 Have used dates in 2021 using day of year to generate a date in 2021. Second step is setting date format as year is irrelevant已使用 2021 年的日期生成 2021 年的日期。第二步是设置日期格式,因为年份无关紧要
  • clearly no seasonality in my data as it is random...显然我的数据没有季节性,因为它是随机的......
import numpy as np
import pandas as pd
import plotly.express as px

n = 365 * 14
df = pd.DataFrame(
    index=pd.date_range("1-jan-2008", periods=n),
    data={c: np.random.randint(1, 45, n) for c in list("ABCDEFGHI")},
)

fig = px.line(
    df.assign(
        year=df.index.year,
        doy=pd.to_datetime(df.index.day_of_year.values + (2021 * 1000), format="%Y%j"),
        value=df.mean(axis=1),
    ),
    x="doy",
    y="value",
    color="year",
    template="plotly_dark"
)

# just for demo purposes, make some traces invisible
for t in fig.data:
    if int(t["name"])<2016: t["visible"]="legendonly"

fig.update_layout(xaxis={"tickformat":"%d-%b"})


在此处输入图像描述

Please note that monitoring seasonality of time-series data is different from plotting time-series data.请注意,监测时间序列数据的季节性不同于绘制时间序列数据。 It is needed to decompose data into its components over time.随着时间的推移,需要将数据分解为其组件。 you can check this answer .你可以检查这个答案 However, just to plot time-series data regardless of format of timestamps in dark background using plt.style.use('dark_background') , it could be as follow:但是,仅使用plt.style.use('dark_background')绘制时间序列数据,而不考虑深色背景中的时间戳格式,它可能如下所示:

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('dark_background')

colors = [
    '#08F7FE',  # teal/cyan
    '#FE53BB',  # pink
    '#F5D300',  # yellow
    '#00ff41',  # matrix green]

df = pd.DataFrame({'A': [1, 3, 9, 5, 2, 1, 1],
                   'B': [4, 5, 5, 7, 9, 8, 6],
                   'C': [7, 5, 3, 1, 5, 9, 3],
                   'D': [3, 6, 7, 4, 3, 2, 1],
                  'date':['10-10-2016', '10-10-2017', '10-10-2018', '10-10-2019', '10-10-2020', '10-10-2021', '10-10-2022']})

# make sure the time column is actually time format
df['date']=pd.to_datetime(df['date'])

# set time as the index
df.set_index('date',inplace=True)

fig, ax = plt.subplots()

df.plot(marker='o', color=colors, ax=ax)

ax.figure.autofmt_xdate(rotation=45, ha='center')
plt.legend(loc='best')
plt.show()

图像

If you want to make it much fancy you can follow Time series Visualization or Matplotlib Cyberpunk Style如果你想让它变得花哨,你可以遵循时间序列可视化Matplotlib 赛博朋克风格

in order to cover following issue:为了涵盖以下问题:

Ideally this may also create a dataframe with yearly columns of data with the index being dd/mm date format to also use.理想情况下,这也可以创建一个数据框,其中包含年度数据列,索引为 dd/mm 日期格式,也可以使用。

Based on this post , you can use import matplotlib.dates as md with desired date-format once you passed date index to x-axis:根据这篇文章,一旦将日期索引传递给 x 轴,您就可以使用import matplotlib.dates as md和所需的日期格式:

df.plot(marker='o', color=colors, ax=ax)
ax.set_xticks(df.index)
ax.figure.autofmt_xdate(rotation=45, ha='center')

####### Use the below functions #######
import matplotlib.dates as md
dtFmt = md.DateFormatter('%d-%b') # define the formatting
ax.xaxis.set_major_formatter(dtFmt) # apply the format to the desired axis

plt.legend(loc='best')
plt.show()

图像

For plotting I suggest you to take a look at matplotlib.对于绘图,我建议你看看 matplotlib。 For dataframe you can use pandas对于数据框,您可以使用 pandas

import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame(yourdata) #to create a dataframe
df.plot() #to plot your data or df.plot(x="A",y="Date") to select what to plot
df["NewDate"] = pd.to_datetime(df['Date'], format='%d/%m') #to create the the date column with format dd/mm (based on the date column you already have)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM