蟒蛇熊猫和密谋。日期和显示出现问题

时间:2020-03-04 11:38:11

标签: python pandas plotly

对不起,我是新来的。
我有一个清晰的pd.DataFrame与日期顺序。

初始日期的格式为:YYYYMMDD。
当我尝试将其转换时,plotly会将日期显示为我只能描述为随机数的日期(悬停文​​本中)。经过大量搜索,我发现我的解决方法(参见代码)是唯一的解决方案。

但要解决一个真正的问题:如您所见,每个月的条目数量都不同。当我放下一天时,会把一个月的所有条目都放在同一个地方。
当我使用x = df.index时,我得到了最好的结果,但是没有日期可视化。 我想让每个条目之间保持均匀的间隔,并有清晰的视觉提示来显示哪个条目属于哪个月。
我将在帖子的末尾添加图片,以更好地解释我的问题(英语不是我的母语。)

代码:

import pandas as pd
import plotly.express as px

columns = ["date", "farts"]
df = pd.read_csv('test.csv', sep=',', engine='python', names=columns)

# Using a smaller made up csv file for testing. It looks like this:
# 20200119, 50
# 20200115, 40
# 20200105, 30
# 20191215, 40
# 20191120, 35
# 20191115, 12

print(df)

df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")

df["date"] = df["date"].dt.strftime('%Y-%m')

print(df)

#works very well so far:

# before:

#        date  farts
# 0  20200119     50
# 1  20200115     40
# 2  20200105     30
# 3  20191215     40
# 4  20191120     35
# 5  20191115     12

# after:

#       date  farts
# 0  2020/01     50
# 1  2020/01     40
# 2  2020/01     30
# 3  2019/12     40
# 4  2019/11     35
# 5  2019/11     12

fig = px.bar(df, x="date", y='farts', width=1000, height=350)
fig.show()

你们有什么想法我可以做些更好的图形吗?

图片有助于理解: https://i.imgur.com/3Vi9xFi.png

编辑:试了一下,我越来越沮丧。要么不显示,日期倒转等等。...

如果我使用df [“ date”],我将无法阻止从相同月份将条目汇总到一个地方的情况。
如果我使用df.index,则似乎无法按照日期列来命名x轴条目。

2 个答案:

答案 0 :(得分:0)

您有2种选择,具体取决于您想要的东西

首先让我们为示例创建数据:

data = [
    ["20200119", 50],
    ["20200115", 40],
    ["20200105", 30],
    ["20191215", 40],
    ["20191120", 35],
    ["20191115", 12],
]

1。按类别绘制

默认情况下,plotly将日期设置为日期,您可以使用以下方式覆盖它:

df = pd.DataFrame(data, columns=["date", "farts"])
df["date"] = "D" + df["date"] # Add a string so that plotly won't transform to date

fig = px.bar(df, x="date", y='farts')

2。每月重采样

如果要绘制每月日期,则应避免重复。为此,您可以对每个月的所有条目进行重新采样并进行meansum

df = pd.DataFrame(data, columns=["date", "farts"])
df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")
df = df.resample('MS', on='date').mean() # You should not have duplicates
df = df.reset_index() # You need date as a column with plotly express

fig = px.bar(df, x="date", y='farts')

答案 1 :(得分:0)

IIUC,您可以绘制然后更新xtick名称的布局。

import pandas as pd
import plotly.graph_objs as go
import plotly.express as px

from io import StringIO

df = """date,farts
20200119, 50
20200115, 40
20200105, 30
20191215, 40
20191120, 35
20191115, 12"""

df = pd.read_csv(StringIO(df))

df["date"] = pd.to_datetime(df["date"], format="%Y%m%d")\
               .dt.strftime('%Y-%m')
df = df.sort_values("date").reset_index(drop=True)

plotly.graph_objs

fig =  go.Figure()
fig.add_trace(go.Bar(x=df.index,y=df["farts"]))
fig.update_layout(
    xaxis = dict(
        tickmode = 'array',
        tickvals = df.index,
        ticktext = df["date"]
    )
)
fig.show()

plotly.express

px.bar(df,x=df.index,y="farts")
fig.update_layout(
    xaxis = dict(
        tickmode = 'array',
        tickvals = df.index,
        ticktext = df["date"]
    )
)

输出相同 enter image description here