为了账号安全,请及时绑定邮箱和手机立即绑定

以日期为 X 轴的 Seaborn 条形图

以日期为 X 轴的 Seaborn 条形图

慕虎7371278 2023-04-18 17:42:02
我曾尝试创建时间序列数据集的条形图,但没有成功。我尝试将日期转换为 Pandas Datetime 对象、Timestamp 对象、原始字符串、浮点数和整数。无论我做什么,我都会收到以下错误:TypeError: float() argument must be a string or a number, not 'Timestamp'以下是一些产生错误的最小示例:在这里,“日期”对象的类型为 <class 'pandas._libs.tslibs.timestamps.Timestamp'>,所以我知道为什么这不起作用:import matplotlib.pylab as pltimport matplotlib.dates as mdatesimport seaborn as snsdef main():    path = 'Data/AQ+RX Counts.csv'    df = pd.read_csv(path, parse_dates=['Date'], index_col=['Date'])    weekly_df = df.resample('W').mean().reset_index()    weekly_df['count'] = df['count'].resample('W').sum().reset_index()    sns.barplot(x = 'Date', y='count', data = weekly_df)    plt.show()main()然后我尝试使日期浮动,打算将它们格式化回之后的日期,但这仍然不起作用:   dates = mdates.datestr2num(weekly_df.Date.astype(str))   weekly_df['n_dates'] = dates   sns.barplot(x = 'n_dates', y='count', data = weekly_df)   plt.show()我也试过使它们成为整数,但无济于事:    dates = mdates.datestr2num(weekly_df.Date.astype(str))    dates = dates.astype(int)    dates = pd.Series(dates)    weekly_df['n_dates'] = dates    sns.barplot(x = 'n_dates', y='count', data = weekly_df)    plt.show()我尝试了许多其他变体,但都产生了相同的错误。我什至将它与其他代码进行了比较,并验证了所有类型都相同,并且比较代码工作正常。我完全不知道从这里去哪里。
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

函数中的转换是'count'从浮点数转换为日期时间数据类型。

使用发布的样本数据

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns


path = 'data/test.csv'

df = pd.read_csv(path, parse_dates=['Date'], index_col=['Date'])


# display(df)

                 WSA       WSV         WDV       WSM        SGT        T2M       T10M   DELTA_T        PBAR       SRAD          RH       PM25        AQI  count

Date                                                                                                                                                           

2015-01-01  1.070833  0.875000  132.958333  3.470833  35.391667  30.729167  30.625000 -0.116667  738.825000  72.666667   99.754167  24.808333  73.307931    0.0

2015-01-02  1.108696  0.939130  148.478261  3.734783  32.465217  34.391304  34.278261 -0.117391  738.347826  61.391304  100.013043  23.500000  64.150725    4.0

2015-01-03  1.017391  0.717391  168.043478  3.773913  42.717391  36.247826  36.160870 -0.095652  739.443478  49.608696  100.769565  20.460870  55.652711    0.0

2015-01-04  1.000000  0.600000  159.958333  3.850000  49.150000  38.887500  38.666667 -0.225000  741.500000  31.541667  101.479167  13.012500  46.835258    0.0

2015-01-05  1.033333  0.441667  137.000000  4.000000  57.566667  42.995833  42.945833 -0.050000  742.533333  44.583333  101.004167  16.654167  52.420271    4.0

2015-01-06  0.781818  0.559091  114.727273  3.654545  42.868182  40.740909  41.095455  0.368182  740.904545  48.272727  100.577273  21.954545  67.318339    6.0

2015-01-07  0.973913  0.830435  110.826087  3.956522  30.817391  40.365217  40.595652  0.221739  739.865217  60.043478  100.195652  24.456522  72.347251    6.0

2015-01-08  0.983333  0.825000  156.500000  4.208333  32.670833  41.520833  41.366667 -0.129167  736.350000  69.583333   99.958333  22.275000  65.770725   10.0

2015-01-09  0.958333  0.729167  133.708333  3.379167  39.645833  42.279167  42.158333 -0.116667  735.204167  60.416667  100.041667  19.370833  59.085129   10.0

2015-01-10  0.966667  0.758333  164.500000  3.675000  37.345833  42.962500  42.775000 -0.200000  734.287500  41.500000  100.120833  14.658333  49.314653    0.0


# resample mean

dfr = df.resample('W').mean()


# add the resampled sum to dfr

dfr['mean'] = df['count'].resample('W').sum()


# reset index

dfr = dfr.reset_index()


# display(dfr)

        Date       WSA       WSV         WDV       WSM        SGT        T2M       T10M   DELTA_T        PBAR       SRAD          RH       PM25        AQI  count  mean

0 2015-01-04  1.049230  0.782880  152.359601  3.707382  39.931069  35.063949  34.932699 -0.138678  739.529076  53.802083  100.503986  20.445426  59.986656    1.0   4.0

1 2015-01-11  0.949566  0.690615  136.210282  3.812261  40.152457  41.810743  41.822823  0.015681  738.190794  54.066590  100.316321  19.894900  61.042728    6.0  36.0


# plot dfr

fig, ax = plt.subplots(figsize=(16, 10)) 

fig = sns.barplot(x='Date', y='count', data=dfr)


# configure the xaxis ticks from datetime to date

x_dates = dfr.Date.dt.strftime('%Y-%m-%d').sort_values().unique()

ax.set_xticklabels(labels=x_dates, rotation=90, ha='right')


plt.show()

//img1.sycdn.imooc.com//643e660e00015b7406560441.jpg

查看完整回答
反对 回复 2023-04-18
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信