如何格式化 pandas 图上的日期时间 xtick 标签 [duplicate]

How to format the datetime xticklabels on a pandas plot [duplicate]

提问人:PatrickT 提问时间:1/9/2022 最后编辑:PatrickT 更新时间:11/19/2023 访问量:553

问:

我想控制日期标签。我正在循环数据的各个子集,有时会绘制很长的间隔,每 10 年进行一次刻度是合适的;有时间隔较短,每 5 年、2 年或 1 年蜱虫一次是合适的;有时绘制几个月的间隔,其中月份标签是合适的;有时是混合情况。我知道如何将日期转换为字符串并提取年份并手动制作标签,但是由于我的日期范围不断变化,因此我希望有一定的灵活性,并尽可能多地使用内置函数。我尝试使用这些功能: , , , : 请参阅下面的恐怖博物馆。我似乎缺少一些基本的东西。matplotlib.datesAutoDateLocatorConciseDateFormatterYearLocatorDateFormatter

在下面的示例中,默认日期标签是 1949 年、1959 年等,我想要 1950 年、1960 年等,所以标签的频率很高,但开始日期不是。有没有办法自动将所选年份设置为 10 或 5 的倍数?

默认绘图

import matplotlib.pyplot as plt
import pandas as pd
from pandas import Timestamp
from numpy import nan

# Default plot:
f, ax = plt.subplots()
df.plot(ax=ax, x='Date')
plt.show()

enter image description here

# attempt 1
# https://matplotlib.org/stable/api/dates_api.html
from matplotlib.dates import YearLocator, DateFormatter
f, ax = plt.subplots()
df.plot(ax=ax, x='Date')
ax.xaxis.set_major_locator(YearLocator(10)) # <- ticks every 10 years
ax.xaxis.set_major_formatter(DateFormatter('%Y'))  # <- show only the year
plt.show()

enter image description here

# attempt 2
# https://matplotlib.org/stable/gallery/ticks/date_concise_formatter.html
from matplotlib.dates import AutoDateLocator, ConciseDateFormatter
f, ax = plt.subplots()
df.plot(ax=ax, x='Date')
locator = AutoDateLocator(minticks=4, maxticks=10)  # <- autodetect a good place to place ticks
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(ConciseDateFormatter(locator))
plt.show() # <- Months appear where they shouldn't

enter image description here

数据:

data_dict = {'Date': {0: Timestamp('1946-01-01 00:00:00'), 1: Timestamp('1946-04-01 00:00:00'), 2: Timestamp('1946-07-01 00:00:00'), 3: Timestamp('1946-10-01 00:00:00'), 4: Timestamp('1947-01-01 00:00:00'), 5: Timestamp('1947-04-01 00:00:00'), 6: Timestamp('1947-07-01 00:00:00'), 7: Timestamp('1947-10-01 00:00:00'), 8: Timestamp('1948-01-01 00:00:00'), 9: Timestamp('1948-04-01 00:00:00'), 10: Timestamp('1948-07-01 00:00:00'), 11: Timestamp('1948-10-01 00:00:00'), 12: Timestamp('1949-01-01 00:00:00'), 13: Timestamp('1949-04-01 00:00:00'), 14: Timestamp('1949-07-01 00:00:00'), 15: Timestamp('1949-10-01 00:00:00'), 16: Timestamp('1950-01-01 00:00:00'), 17: Timestamp('1950-04-01 00:00:00'), 18: Timestamp('1950-07-01 00:00:00'), 19: Timestamp('1950-10-01 00:00:00'), 20: Timestamp('1951-01-01 00:00:00'), 21: Timestamp('1951-04-01 00:00:00'), 22: Timestamp('1951-07-01 00:00:00'), 23: Timestamp('1951-10-01 00:00:00'), 24: Timestamp('1952-01-01 00:00:00'), 25: Timestamp('1952-04-01 00:00:00'), 26: Timestamp('1952-07-01 00:00:00'), 27: Timestamp('1952-10-01 00:00:00'), 28: Timestamp('1953-01-01 00:00:00'), 29: Timestamp('1953-04-01 00:00:00'), 30: Timestamp('1953-07-01 00:00:00'), 31: Timestamp('1953-10-01 00:00:00'), 32: Timestamp('1954-01-01 00:00:00'), 33: Timestamp('1954-04-01 00:00:00'), 34: Timestamp('1954-07-01 00:00:00'), 35: Timestamp('1954-10-01 00:00:00'), 36: Timestamp('1955-01-01 00:00:00'), 37: Timestamp('1955-04-01 00:00:00'), 38: Timestamp('1955-07-01 00:00:00'), 39: Timestamp('1955-10-01 00:00:00'), 40: Timestamp('1956-01-01 00:00:00'), 41: Timestamp('1956-04-01 00:00:00'), 42: Timestamp('1956-07-01 00:00:00'), 43: Timestamp('1956-10-01 00:00:00'), 44: Timestamp('1957-01-01 00:00:00'), 45: Timestamp('1957-04-01 00:00:00'), 46: Timestamp('1957-07-01 00:00:00'), 47: Timestamp('1957-10-01 00:00:00'), 48: Timestamp('1958-01-01 00:00:00'), 49: Timestamp('1958-04-01 00:00:00'), 50: Timestamp('1958-07-01 00:00:00'), 51: Timestamp('1958-10-01 00:00:00'), 52: Timestamp('1959-01-01 00:00:00'), 53: Timestamp('1959-04-01 00:00:00'), 54: Timestamp('1959-07-01 00:00:00'), 55: Timestamp('1959-10-01 00:00:00'), 56: Timestamp('1960-01-01 00:00:00'), 57: Timestamp('1960-04-01 00:00:00'), 58: Timestamp('1960-07-01 00:00:00'), 59: Timestamp('1960-10-01 00:00:00'), 60: Timestamp('1961-01-01 00:00:00'), 61: Timestamp('1961-04-01 00:00:00'), 62: Timestamp('1961-07-01 00:00:00'), 63: Timestamp('1961-10-01 00:00:00'), 64: Timestamp('1962-01-01 00:00:00'), 65: Timestamp('1962-04-01 00:00:00'), 66: Timestamp('1962-07-01 00:00:00'), 67: Timestamp('1962-10-01 00:00:00'), 68: Timestamp('1963-01-01 00:00:00'), 69: Timestamp('1963-04-01 00:00:00'), 70: Timestamp('1963-07-01 00:00:00'), 71: Timestamp('1963-10-01 00:00:00'), 72: Timestamp('1964-01-01 00:00:00'), 73: Timestamp('1964-04-01 00:00:00'), 74: Timestamp('1964-07-01 00:00:00'), 75: Timestamp('1964-10-01 00:00:00'), 76: Timestamp('1965-01-01 00:00:00'), 77: Timestamp('1965-04-01 00:00:00'), 78: Timestamp('1965-07-01 00:00:00'), 79: Timestamp('1965-10-01 00:00:00'), 80: Timestamp('1966-01-01 00:00:00'), 81: Timestamp('1966-04-01 00:00:00'), 82: Timestamp('1966-07-01 00:00:00'), 83: Timestamp('1966-10-01 00:00:00'), 84: Timestamp('1967-01-01 00:00:00'), 85: Timestamp('1967-04-01 00:00:00'), 86: Timestamp('1967-07-01 00:00:00'), 87: Timestamp('1967-10-01 00:00:00'), 88: Timestamp('1968-01-01 00:00:00'), 89: Timestamp('1968-04-01 00:00:00'), 90: Timestamp('1968-07-01 00:00:00'), 91: Timestamp('1968-10-01 00:00:00'), 92: Timestamp('1969-01-01 00:00:00'), 93: Timestamp('1969-04-01 00:00:00'), 94: Timestamp('1969-07-01 00:00:00'), 95: Timestamp('1969-10-01 00:00:00'), 96: Timestamp('1970-01-01 00:00:00'), 97: Timestamp('1970-04-01 00:00:00'), 98: Timestamp('1970-07-01 00:00:00'), 99: Timestamp('1970-10-01 00:00:00'), 100: Timestamp('1971-01-01 00:00:00'), 101: Timestamp('1971-04-01 00:00:00'), 102: Timestamp('1971-07-01 00:00:00'), 103: Timestamp('1971-10-01 00:00:00'), 104: Timestamp('1972-01-01 00:00:00'), 105: Timestamp('1972-04-01 00:00:00'), 106: Timestamp('1972-07-01 00:00:00'), 107: Timestamp('1972-10-01 00:00:00'), 108: Timestamp('1973-01-01 00:00:00'), 109: Timestamp('1973-04-01 00:00:00'), 110: Timestamp('1973-07-01 00:00:00'), 111: Timestamp('1973-10-01 00:00:00'), 112: Timestamp('1974-01-01 00:00:00'), 113: Timestamp('1974-04-01 00:00:00'), 114: Timestamp('1974-07-01 00:00:00'), 115: Timestamp('1974-10-01 00:00:00'), 116: Timestamp('1975-01-01 00:00:00'), 117: Timestamp('1975-04-01 00:00:00'), 118: Timestamp('1975-07-01 00:00:00'), 119: Timestamp('1975-10-01 00:00:00'), 120: Timestamp('1976-01-01 00:00:00'), 121: Timestamp('1976-04-01 00:00:00'), 122: Timestamp('1976-07-01 00:00:00'), 123: Timestamp('1976-10-01 00:00:00'), 124: Timestamp('1977-01-01 00:00:00'), 125: Timestamp('1977-04-01 00:00:00'), 126: Timestamp('1977-07-01 00:00:00'), 127: Timestamp('1977-10-01 00:00:00'), 128: Timestamp('1978-01-01 00:00:00'), 129: Timestamp('1978-04-01 00:00:00'), 130: Timestamp('1978-07-01 00:00:00'), 131: Timestamp('1978-10-01 00:00:00'), 132: Timestamp('1979-01-01 00:00:00'), 133: Timestamp('1979-04-01 00:00:00'), 134: Timestamp('1979-07-01 00:00:00'), 135: Timestamp('1979-10-01 00:00:00'), 136: Timestamp('1980-01-01 00:00:00'), 137: Timestamp('1980-04-01 00:00:00'), 138: Timestamp('1980-07-01 00:00:00'), 139: Timestamp('1980-10-01 00:00:00'), 140: Timestamp('1981-01-01 00:00:00'), 141: Timestamp('1981-04-01 00:00:00'), 142: Timestamp('1981-07-01 00:00:00'), 143: Timestamp('1981-10-01 00:00:00'), 144: Timestamp('1982-01-01 00:00:00'), 145: Timestamp('1982-04-01 00:00:00'), 146: Timestamp('1982-07-01 00:00:00'), 147: Timestamp('1982-10-01 00:00:00'), 148: Timestamp('1983-01-01 00:00:00'), 149: Timestamp('1983-04-01 00:00:00'), 150: Timestamp('1983-07-01 00:00:00'), 151: Timestamp('1983-10-01 00:00:00'), 152: Timestamp('1984-01-01 00:00:00'), 153: Timestamp('1984-04-01 00:00:00'), 154: Timestamp('1984-07-01 00:00:00'), 155: Timestamp('1984-10-01 00:00:00'), 156: Timestamp('1985-01-01 00:00:00'), 157: Timestamp('1985-04-01 00:00:00'), 158: Timestamp('1985-07-01 00:00:00'), 159: Timestamp('1985-10-01 00:00:00'), 160: Timestamp('1986-01-01 00:00:00'), 161: Timestamp('1986-04-01 00:00:00'), 162: Timestamp('1986-07-01 00:00:00'), 163: Timestamp('1986-10-01 00:00:00'), 164: Timestamp('1987-01-01 00:00:00'), 165: Timestamp('1987-04-01 00:00:00'), 166: Timestamp('1987-07-01 00:00:00'), 167: Timestamp('1987-10-01 00:00:00'), 168: Timestamp('1988-01-01 00:00:00'), 169: Timestamp('1988-04-01 00:00:00'), 170: Timestamp('1988-07-01 00:00:00'), 171: Timestamp('1988-10-01 00:00:00'), 172: Timestamp('1989-01-01 00:00:00'), 173: Timestamp('1989-04-01 00:00:00'), 174: Timestamp('1989-07-01 00:00:00'), 175: Timestamp('1989-10-01 00:00:00'), 176: Timestamp('1990-01-01 00:00:00'), 177: Timestamp('1990-04-01 00:00:00'), 178: Timestamp('1990-07-01 00:00:00'), 179: Timestamp('1990-10-01 00:00:00'), 180: Timestamp('1991-01-01 00:00:00'), 181: Timestamp('1991-04-01 00:00:00'), 182: Timestamp('1991-07-01 00:00:00'), 183: Timestamp('1991-10-01 00:00:00'), 184: Timestamp('1992-01-01 00:00:00'), 185: Timestamp('1992-04-01 00:00:00'), 186: Timestamp('1992-07-01 00:00:00'), 187: Timestamp('1992-10-01 00:00:00'), 188: Timestamp('1993-01-01 00:00:00'), 189: Timestamp('1993-04-01 00:00:00'), 190: Timestamp('1993-07-01 00:00:00'), 191: Timestamp('1993-10-01 00:00:00'), 192: Timestamp('1994-01-01 00:00:00'), 193: Timestamp('1994-04-01 00:00:00'), 194: Timestamp('1994-07-01 00:00:00'), 195: Timestamp('1994-10-01 00:00:00'), 196: Timestamp('1995-01-01 00:00:00'), 197: Timestamp('1995-04-01 00:00:00'), 198: Timestamp('1995-07-01 00:00:00'), 199: Timestamp('1995-10-01 00:00:00'), 200: Timestamp('1996-01-01 00:00:00'), 201: Timestamp('1996-04-01 00:00:00'), 202: Timestamp('1996-07-01 00:00:00'), 203: Timestamp('1996-10-01 00:00:00'), 204: Timestamp('1997-01-01 00:00:00'), 205: Timestamp('1997-04-01 00:00:00'), 206: Timestamp('1997-07-01 00:00:00'), 207: Timestamp('1997-10-01 00:00:00'), 208: Timestamp('1998-01-01 00:00:00'), 209: Timestamp('1998-04-01 00:00:00'), 210: Timestamp('1998-07-01 00:00:00'), 211: Timestamp('1998-10-01 00:00:00'), 212: Timestamp('1999-01-01 00:00:00'), 213: Timestamp('1999-04-01 00:00:00'), 214: Timestamp('1999-07-01 00:00:00'), 215: Timestamp('1999-10-01 00:00:00'), 216: Timestamp('2000-01-01 00:00:00'), 217: Timestamp('2000-04-01 00:00:00'), 218: Timestamp('2000-07-01 00:00:00'), 219: Timestamp('2000-10-01 00:00:00'), 220: Timestamp('2001-01-01 00:00:00'), 221: Timestamp('2001-04-01 00:00:00'), 222: Timestamp('2001-07-01 00:00:00'), 223: Timestamp('2001-10-01 00:00:00'), 224: Timestamp('2002-01-01 00:00:00'), 225: Timestamp('2002-04-01 00:00:00'), 226: Timestamp('2002-07-01 00:00:00'), 227: Timestamp('2002-10-01 00:00:00'), 228: Timestamp('2003-01-01 00:00:00'), 229: Timestamp('2003-04-01 00:00:00'), 230: Timestamp('2003-07-01 00:00:00'), 231: Timestamp('2003-10-01 00:00:00'), 232: Timestamp('2004-01-01 00:00:00'), 233: Timestamp('2004-04-01 00:00:00'), 234: Timestamp('2004-07-01 00:00:00'), 235: Timestamp('2004-10-01 00:00:00'), 236: Timestamp('2005-01-01 00:00:00'), 237: Timestamp('2005-04-01 00:00:00'), 238: Timestamp('2005-07-01 00:00:00'), 239: Timestamp('2005-10-01 00:00:00'), 240: Timestamp('2006-01-01 00:00:00'), 241: Timestamp('2006-04-01 00:00:00'), 242: Timestamp('2006-07-01 00:00:00'), 243: Timestamp('2006-10-01 00:00:00'), 244: Timestamp('2007-01-01 00:00:00'), 245: Timestamp('2007-04-01 00:00:00'), 246: Timestamp('2007-07-01 00:00:00'), 247: Timestamp('2007-10-01 00:00:00'), 248: Timestamp('2008-01-01 00:00:00'), 249: Timestamp('2008-04-01 00:00:00'), 250: Timestamp('2008-07-01 00:00:00'), 251: Timestamp('2008-10-01 00:00:00'), 252: Timestamp('2009-01-01 00:00:00'), 253: Timestamp('2009-04-01 00:00:00'), 254: Timestamp('2009-07-01 00:00:00'), 255: Timestamp('2009-10-01 00:00:00'), 256: Timestamp('2010-01-01 00:00:00'), 257: Timestamp('2010-04-01 00:00:00'), 258: Timestamp('2010-07-01 00:00:00'), 259: Timestamp('2010-10-01 00:00:00'), 260: Timestamp('2011-01-01 00:00:00'), 261: Timestamp('2011-04-01 00:00:00'), 262: Timestamp('2011-07-01 00:00:00'), 263: Timestamp('2011-10-01 00:00:00'), 264: Timestamp('2012-01-01 00:00:00'), 265: Timestamp('2012-04-01 00:00:00'), 266: Timestamp('2012-07-01 00:00:00'), 267: Timestamp('2012-10-01 00:00:00'), 268: Timestamp('2013-01-01 00:00:00'), 269: Timestamp('2013-04-01 00:00:00'), 270: Timestamp('2013-07-01 00:00:00'), 271: Timestamp('2013-10-01 00:00:00'), 272: Timestamp('2014-01-01 00:00:00'), 273: Timestamp('2014-04-01 00:00:00'), 274: Timestamp('2014-07-01 00:00:00'), 275: Timestamp('2014-10-01 00:00:00'), 276: Timestamp('2015-01-01 00:00:00'), 277: Timestamp('2015-04-01 00:00:00'), 278: Timestamp('2015-07-01 00:00:00'), 279: Timestamp('2015-10-01 00:00:00'), 280: Timestamp('2016-01-01 00:00:00'), 281: Timestamp('2016-04-01 00:00:00'), 282: Timestamp('2016-07-01 00:00:00'), 283: Timestamp('2016-10-01 00:00:00'), 284: Timestamp('2017-01-01 00:00:00'), 285: Timestamp('2017-04-01 00:00:00'), 286: Timestamp('2017-07-01 00:00:00'), 287: Timestamp('2017-10-01 00:00:00'), 288: Timestamp('2018-01-01 00:00:00'), 289: Timestamp('2018-04-01 00:00:00'), 290: Timestamp('2018-07-01 00:00:00'), 291: Timestamp('2018-10-01 00:00:00'), 292: Timestamp('2019-01-01 00:00:00'), 293: Timestamp('2019-04-01 00:00:00'), 294: Timestamp('2019-07-01 00:00:00'), 295: Timestamp('2019-10-01 00:00:00'), 296: Timestamp('2020-01-01 00:00:00'), 297: Timestamp('2020-04-01 00:00:00'), 298: Timestamp('2020-07-01 00:00:00'), 299: Timestamp('2020-10-01 00:00:00'), 300: Timestamp('2021-01-01 00:00:00'), 301: Timestamp('2021-04-01 00:00:00'), 302: Timestamp('2021-07-01 00:00:00')}, 'Gross Domestic Product': {0: nan, 1: nan, 2: nan, 3: nan, 4: 243.164, 5: 245.968, 6: 249.585, 7: 259.745, 8: 265.742, 9: 272.567, 10: 279.196, 11: 280.366, 12: 275.034, 13: 271.351, 14: 272.889, 15: 270.627, 16: 280.828, 17: 290.383, 18: 308.153, 19: 319.945, 20: 336.0, 21: 344.09, 22: 351.385, 23: 356.178, 24: 359.82, 25: 361.03, 26: 367.701, 27: 380.812, 28: 387.98, 29: 391.749, 30: 391.171, 31: 385.97, 32: 385.345, 33: 386.121, 34: 390.996, 35: 399.734, 36: 413.073, 37: 421.532, 38: 430.221, 39: 437.092, 40: 439.746, 41: 446.01, 42: 451.191, 43: 460.463, 44: 469.779, 45: 472.025, 46: 479.49, 47: 474.864, 48: 467.54, 49: 471.978, 50: 485.841, 51: 499.555, 52: 510.33, 53: 522.653, 54: 525.034, 55: 528.6, 56: 542.648, 57: 541.08, 58: 545.604, 59: 540.197, 60: 545.018, 61: 555.545, 62: 567.664, 63: 580.612, 64: 594.013, 65: 600.366, 66: 609.027, 67: 612.28, 68: 621.672, 69: 629.752, 70: 644.444, 71: 653.938, 72: 669.822, 73: 678.674, 74: 692.031, 75: 697.319, 76: 717.79, 77: 730.191, 78: 749.323, 79: 771.857, 80: 795.734, 81: 804.981, 82: 819.638, 83: 833.302, 84: 844.17, 85: 848.983, 86: 865.233, 87: 881.439, 88: 909.387, 89: 934.344, 90: 950.825, 91: 968.03, 92: 993.337, 93: 1009.02, 94: 1029.956, 95: 1038.147, 96: 1051.2, 97: 1067.375, 98: 1086.059, 99: 1088.608, 100: 1135.156, 101: 1156.271, 102: 1177.675, 103: 1190.297, 104: 1230.609, 105: 1266.369, 106: 1290.566, 107: 1328.904, 108: 1377.49, 109: 1413.887, 110: 1433.838, 111: 1476.289, 112: 1491.209, 113: 1530.056, 114: 1560.026, 115: 1599.679, 116: 1616.116, 117: 1651.853, 118: 1709.82, 119: 1761.831, 120: 1820.487, 121: 1852.332, 122: 1886.558, 123: 1934.273, 124: 1988.648, 125: 2055.909, 126: 2118.473, 127: 2164.27, 128: 2202.76, 129: 2331.633, 130: 2395.053, 131: 2476.949, 132: 2526.61, 133: 2591.247, 134: 2667.565, 135: 2723.883, 136: 2789.842, 137: 2797.352, 138: 2856.483, 139: 2985.557, 140: 3124.206, 141: 3162.532, 142: 3260.609, 143: 3280.818, 144: 3274.302, 145: 3331.972, 146: 3366.322, 147: 3402.561, 148: 3473.413, 149: 3578.848, 150: 3689.179, 151: 3794.706, 152: 3908.054, 153: 4009.601, 154: 4084.25, 155: 4148.551, 156: 4230.168, 157: 4294.887, 158: 4386.773, 159: 4444.094, 160: 4507.894, 161: 4545.34, 162: 4607.669, 163: 4657.627, 164: 4722.156, 165: 4806.16, 166: 4884.555, 167: 5007.994, 168: 5073.372, 169: 5190.036, 170: 5282.835, 171: 5399.509, 172: 5511.253, 173: 5612.463, 174: 5695.365, 175: 5747.237, 176: 5872.701, 177: 5960.028, 178: 6015.116, 179: 6004.733, 180: 6035.178, 181: 6126.862, 182: 6205.937, 183: 6264.54, 184: 6363.102, 185: 6470.763, 186: 6566.641, 187: 6680.803, 188: 6729.459, 189: 6808.939, 190: 6882.098, 191: 7013.738, 192: 7115.652, 193: 7246.931, 194: 7331.075, 195: 7455.288, 196: 7522.289, 197: 7580.997, 198: 7683.125, 199: 7772.586, 200: 7868.468, 201: 8032.84, 202: 8131.408, 203: 8259.771, 204: 8362.655, 205: 8518.825, 206: 8662.823, 207: 8765.907, 208: 8866.48, 209: 8969.699, 210: 9121.097, 211: 9293.991, 212: 9411.682, 213: 9526.21, 214: 9686.626, 215: 9900.169, 216: 10002.179, 217: 10247.72, 218: 10318.165, 219: 10435.744, 220: 10470.231, 221: 10599.0, 222: 10598.02, 223: 10660.465, 224: 10783.5, 225: 10887.46, 226: 10984.04, 227: 11061.433, 228: 11174.129, 229: 11312.766, 230: 11566.669, 231: 11772.234, 232: 11923.447, 233: 12112.815, 234: 12305.307, 235: 12527.214, 236: 12767.286, 237: 12922.656, 238: 13142.642, 239: 13324.204, 240: 13599.16, 241: 13753.424, 242: 13870.188, 243: 14039.56, 244: 14215.651, 245: 14402.082, 246: 14564.117, 247: 14715.058, 248: 14706.538, 249: 14865.701, 250: 14898.999, 251: 14608.208, 252: 14430.901, 253: 14381.236, 254: 14448.882, 255: 14651.248, 256: 14764.611, 257: 14980.193, 258: 15141.605, 259: 15309.471, 260: 15351.444, 261: 15557.535, 262: 15647.681, 263: 15842.267, 264: 16068.824, 265: 16207.13, 266: 16319.54, 267: 16420.386, 268: 16629.05, 269: 16699.551, 270: 16911.068, 271: 17133.114, 272: 17144.281, 273: 17462.703, 274: 17743.227, 275: 17852.54, 276: 17991.348, 277: 18193.707, 278: 18306.96, 279: 18332.079, 280: 18425.306, 281: 18611.617, 282: 18775.459, 283: 18968.041, 284: 19153.912, 285: 19322.92, 286: 19558.693, 287: 19882.965, 288: 20143.716, 289: 20492.492, 290: 20659.102, 291: 20813.325, 292: 21001.591, 293: 21289.268, 294: 21505.012, 295: 21694.458, 296: 21481.367, 297: 19477.444, 298: 21138.574, 299: 21477.597, 300: 22038.226, 301: 22740.959, 302: 23202.344}}

df = pd.DataFrame(data_dict)

当我循环时,我会访问像 这样的小子集。df.loc[(df['Date'] >= "2019") & (df['Date'] <= "2021")]

编辑:链接的问题报告了我没有得到的,所以我的问题不是重复的。公认的答案建议使用 ,这也是这里解决方案的关键。但这并不意味着这个问题是重复的。ValueErrorcompat=True

python pandas matplotlib 日期时间

评论


答:

1赞 PatrickT 1/15/2022 #1

要重新获得对刻度位置和刻度标签格式的控制,在使用绘图包装器时,需要将 .这是因为包装器在后台使用 s 和 s 做了很多工作。在大多数情况下,做得很好,但如果你想要更特殊的控制,你需要访问 的定位器和格式化程序。以下是实现预期结果的一种方法。pandasx_compat=Truepandaslocatorformatterpandasmatplotlib

from matplotlib.dates import YearLocator, DateFormatter
f, ax = plt.subplots()
df.plot(ax=ax, x='Date', x_compat=True)
ax.xaxis.set_major_locator(YearLocator(10))
ax.xaxis.set_major_formatter(DateFormatter("%Y"))
ax.xaxis.set_tick_params(rotation=0)
plt.show() 

enter image description here

如果时间范围较短,则可能的自定义(与默认值没有太大区别)如下:pandas

from matplotlib.dates import YearLocator, MonthLocator, DateFormatter
f, ax = plt.subplots()
df.plot(ax=ax, x='Date', x_compat=True)
ax.xaxis.set_major_locator(YearLocator(1))
ax.xaxis.set_major_formatter(DateFormatter("%b\n%Y"))
ax.xaxis.set_tick_params(rotation=0)
ax.xaxis.set_minor_locator(MonthLocator(7))
ax.xaxis.set_minor_formatter(DateFormatter("%b"))
ax.xaxis.set_label_text('')
plt.show() 

enter image description here

我还成功地将一千个分隔符添加到 y 轴上:

from matplotlib.ticker import FuncFormatter
ax.yaxis.set_minor_formatter(FuncFormatter(lambda x, pos: format(int(x), ',')))

或视情况而定。.set_major_formatter

但现在这显然是题外话了。