Look at the pysolar docs (http://pysolar.readthedocs.io/en/latest/) under "Estimate of clear sky radiation". The algorithm does not return zeros at night, but instead just plugs those numbers straight in, giving nonsensical values. Filter the results so that if `altitude_deg` < 0, the radiation is 0. An example just using pysolar, datetime, and pyplot (I don't use pandas, so I can't comment on that) and lists looks like:

    import datetime
    import matplotlib.pyplot as plt
    import pysolar
    lat, lon = 39.9075, 116.39723  # Beijing, China
    timezone = datetime.timezone(datetime.timedelta(hours=8))  # 0800 UTC
    start = datetime.datetime(2018,1,1,tzinfo=timezone)  # 1 Jan 2018
    
    # Calculate radiation every hour for 90 days
    nhr = 24*90
    dates, altitudes_deg, radiations = list(), list(), list()
    for ihr in range(nhr):
        date = start + datetime.timedelta(hours=ihr)
        altitude_deg = pysolar.solar.get_altitude(lat,lon,date)
        if altitude_deg <= 0:
            radiation = 0.
        else:
            radiation = pysolar.radiation.get_radiation_direct(date,altitude_deg)
        dates.append(date)
        altitudes_deg.append(altitude_deg)
        radiations.append(radiation)
    
    days = [ihr/24 for ihr in range(nhr)]
    fig, axs = plt.subplots(nrows=2,ncols=1,sharex=True)
    axs[0].plot(days,altitudes_deg)
    axs[0].set_title('Solar altitude, degrees')
    axs[1].plot(days,radiations)
    axs[1].set_title('Solar radiation, W/m2')
    axs[1].set_xlabel('Days since ' + start.strftime('%Y/%m/%d %H:%M UTC'))
    plt.show()

[![Altitude and radiation plot][1]][1]


  [1]: https://i.sstatic.net/t5MAT.png