【问题标题】:Plotting with full dates as the axis以完整日期为轴进行绘图
【发布时间】:2019-09-26 04:53:19
【问题描述】:

我的数据 x 轴有问题。目前,它看起来像这样。

[201909240908, 201909240956, 201909241002, ...] 格式为YYYYMMDDHHMM。这张图不仅是错误的(中间不应该是一条直线),而且很难阅读。

如何在保留日期的同时更改我的 a 轴数据?理想情况下,x 轴值将在底部显示为DDHHMM,并隐藏年份和月份。


更新

现在显示的日期好多了。但是间隔是相等的,而不是准确的。

【问题讨论】:

  • 我尝试通过对列表中的每个值执行此操作来更改 x 轴数据 x_val = x_val - first_x_val
  • 您是否在代码中的某处指定YYYYMMDDHHMM 来解析它?这会引起混淆,因为MM 被用来表示月份和分钟
  • @Saharsh 是的,这种格式只是为了帮助读者了解它的含义。这就是它的实际工作方式。 int(f'{entry.year}{pad_number(entry.month, 2)}{pad_number(entry.day, 2)}{entry.time}')
  • 有道理。介意你可以在这里发布代码吗?我也许能理解你是怎么做到的。
  • @Saharsh 获取x轴信息的代码? pastebin.com/uqMJLczG 需要运行的整个代码很长,所以我只包括了获取 x 轴值的部分

标签: python python-3.x plotly


【解决方案1】:

这里似乎有两个问题:

  1. 日期格式
  2. 图表中的线性间距 -(未解决)

日期格式: 此答案使用您的日期列表解决了日期格式问题。我们将使用pandas.DataFrame 来处理数据的格式化并将数据传递到plotly,因为它们可以很好地协同工作。

这是带有 cmets 的示例代码。 我已经模拟了这些值,但日期是你的。

线性间距: 不幸的是,我无法找到一种方法来设置日期轴,并且日期之间具有代表性(不相等)间距。还有谁?但是下面的代码解决方案使您可以使用 xaxis 上的 'type': 'category' 参数将日期用作 xaxis。

我没有对输出图表应用任何漂亮的格式 - 这取决于你。 :-)

import pandas as pd
import numpy as np
import plotly.graph_objs as go
from plotly.offline import plot

# Builing date range from yours.
dates = [201909240908, 201909240956, 201909241002, 201909241056, 201909241113, 201909241156, 
         201909241200, 201909241227, 201909241256, 201909241301, 201909241356, 201909241456, 
         201909241547, 201909241556, 201909241648, 201909241656, 201909241704, 201909241756, 
         201909241936, 201909241956, 201909242008, 201909242056, 201909242151, 201909242156, 
         201909242218, 201909242256, 201909242315, 201909242356, 201909250041, 201909250056, 
         201909250057, 201909250156, 201909250200, 201909250256, 201909250356, 201909250400, 
         201909250456, 201909250556, 201909250656, 201909250756, 201909250856, 201909250956, 
         201909251056, 201909251156, 201909251256, 201909251356]
# Simulate values.
values = np.random.randint(250, 350, len(dates)).tolist()

# Add dates and values to a DataFrame.
df = pd.DataFrame({'Dates': dates, 'Values': values})
# Format your dates.
df['Dates'] = pd.to_datetime(dates, format='%Y%m%d%H%M').strftime('%Y-%d-%m %H:%M')

# Create plot.
trace = go.Scatter(x=df['Dates'], y=df['Values'])
layout = {}
layout.update({'xaxis': {'type': 'category'}})
layout.update({'yaxis': {'range': [0, 400]}})
fig = {'data': [trace], 'layout': layout}
plot(fig)

替代日期格式: 将日期转换为 datetime 对象列表(并省略 DataFrame)的另一种方法是:

datesf = [pd.datetime.strptime(str(date), "%Y%m%d%H%M") for date in dates] 

这将返回:

[datetime.datetime(2019, 9, 24, 9, 8), datetime.datetime(2019, 9, 24, 9, 56), ... ]

【讨论】:

  • 这对我有用 dates_new = [pd.datetime.strptime(str(dt_int), "%Y%m%d%H%M") for dt_int in dates] 如果您想更新答案,我会接受。
  • @Vader - 你来了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多