在 Altair 中绘图不显示 DataFrame 的最新可用日期
Plot in Altair not showing latest available date of DataFrame
为什么我的 Altair 图没有显示我的数据框的最新可用日期。 (下面是我的 df 的图片,用于某些上下文)
我已经尝试了几个绘图,但工具提示显示它只是在考虑最新可用日期的前一天。这意味着,最新日期是 2020-12-05
,但情节显示 2020-12-04
。
最后,这是我的剧情代码:
confirmed_daily = alt.Chart(df.reset_index()).mark_bar(size=2).encode(
alt.X('index:T', title=" "),
alt.Y('confirmed_daily:Q', title=" "),
tooltip=[alt.Tooltip('index:T', title="Fecha"), alt.Tooltip('confirmed:Q', title="Casos acumulados"), alt.Tooltip('confirmed_daily:Q', title="Nuevos Casos")]
).properties(
title={
"text":["Casos diarios de COVID-19 en Colima"],
"subtitle": ["Datos del 15 de marzo al 04 de diciembre de 2020.", " "]
},
width = 800,
height = 400
)
confirmed_daily.save("graphs/confirmed_daily.html")
confirmed_daily
我没有注意到什么?
TL;DR – 将您的日期字符串转换为 pandas 日期时间,一切都会正常工作:
df.index = pd.to_datetime(df.index)
这个问题,不管你信不信,是因为 Javascript 日期解析的一个怪癖。 Javascript 以 UTC 格式解析部分日期字符串,但以本地时间解析完整的 ISO-8601 日期字符串。您可以在 Javascript 控制台中观察到这一点(我是 运行 在设置为 PST 的计算机上):
> new Date('2020-12-05')
Fri Dec 04 2020 16:00:00 GMT-0800 (Pacific Standard Time)
> new Date('2020-12-05T00:00:00')
Sat Dec 05 2020 00:00:00 GMT-0800 (Pacific Standard Time)
因为您的日期被指定为仅包含年、月和日的字符串,它们被 Vega-Lite (Javascript) 渲染器解析为 UTC 时间,因此它们显示为前一天因为您的计算机设置为格林威治标准时间以西的时区。 (如果您 运行 在东欧或中国使用此代码,它会按预期运行 — Javascript 不是很有趣吗?)
Altair 通过确保所有日期输入都序列化为完整的 ISO 8601 字符串来解决 Javascript 的这个“功能”,但这仅适用于那些日期输入是实际 pandas 日期时间类型的情况。例如,这里有一些指定为字符串的日期:
import altair as alt
import pandas as pd
df = pd.DataFrame({
'date': ['2020-12-01', '2020-12-02', '2020-12-03', '2020-12-04'],
'value': [2, 3, 1, 4],
})
alt.Chart(df).mark_bar().encode(
x='value:Q',
y='yearmonthdate(date):O',
)
请注意,这几天是休息日,因为我的计算机处于 US/Pacific 时区,但日期被解析为 UTC。
如果将这一列字符串转换为一列 Pandas 日期时间对象,结果就是您所期望的:
df['date'] = pd.to_datetime(df['date'])
alt.Chart(df).mark_bar().encode(
x='value:Q',
y='yearmonthdate(date):O',
)
将您的字符串日期转换为 pandas 日期时间,此问题不应再出现。
为什么我的 Altair 图没有显示我的数据框的最新可用日期。 (下面是我的 df 的图片,用于某些上下文)
我已经尝试了几个绘图,但工具提示显示它只是在考虑最新可用日期的前一天。这意味着,最新日期是 2020-12-05
,但情节显示 2020-12-04
。
最后,这是我的剧情代码:
confirmed_daily = alt.Chart(df.reset_index()).mark_bar(size=2).encode(
alt.X('index:T', title=" "),
alt.Y('confirmed_daily:Q', title=" "),
tooltip=[alt.Tooltip('index:T', title="Fecha"), alt.Tooltip('confirmed:Q', title="Casos acumulados"), alt.Tooltip('confirmed_daily:Q', title="Nuevos Casos")]
).properties(
title={
"text":["Casos diarios de COVID-19 en Colima"],
"subtitle": ["Datos del 15 de marzo al 04 de diciembre de 2020.", " "]
},
width = 800,
height = 400
)
confirmed_daily.save("graphs/confirmed_daily.html")
confirmed_daily
我没有注意到什么?
TL;DR – 将您的日期字符串转换为 pandas 日期时间,一切都会正常工作:
df.index = pd.to_datetime(df.index)
这个问题,不管你信不信,是因为 Javascript 日期解析的一个怪癖。 Javascript 以 UTC 格式解析部分日期字符串,但以本地时间解析完整的 ISO-8601 日期字符串。您可以在 Javascript 控制台中观察到这一点(我是 运行 在设置为 PST 的计算机上):
> new Date('2020-12-05')
Fri Dec 04 2020 16:00:00 GMT-0800 (Pacific Standard Time)
> new Date('2020-12-05T00:00:00')
Sat Dec 05 2020 00:00:00 GMT-0800 (Pacific Standard Time)
因为您的日期被指定为仅包含年、月和日的字符串,它们被 Vega-Lite (Javascript) 渲染器解析为 UTC 时间,因此它们显示为前一天因为您的计算机设置为格林威治标准时间以西的时区。 (如果您 运行 在东欧或中国使用此代码,它会按预期运行 — Javascript 不是很有趣吗?)
Altair 通过确保所有日期输入都序列化为完整的 ISO 8601 字符串来解决 Javascript 的这个“功能”,但这仅适用于那些日期输入是实际 pandas 日期时间类型的情况。例如,这里有一些指定为字符串的日期:
import altair as alt
import pandas as pd
df = pd.DataFrame({
'date': ['2020-12-01', '2020-12-02', '2020-12-03', '2020-12-04'],
'value': [2, 3, 1, 4],
})
alt.Chart(df).mark_bar().encode(
x='value:Q',
y='yearmonthdate(date):O',
)
请注意,这几天是休息日,因为我的计算机处于 US/Pacific 时区,但日期被解析为 UTC。
如果将这一列字符串转换为一列 Pandas 日期时间对象,结果就是您所期望的:
df['date'] = pd.to_datetime(df['date'])
alt.Chart(df).mark_bar().encode(
x='value:Q',
y='yearmonthdate(date):O',
)
将您的字符串日期转换为 pandas 日期时间,此问题不应再出现。