如何使用 between 将字符串值转换为 pandas 范围选择的 DateTimeIndex?

How to convert string value to DateTimeIndex for pandas range selection using between?

我有一个 pandas read excel 方法,从那里我得到一个数据框,parse_dates 参数默认为 false。对于 Dash 的可视化,开始时间和结束时间有两个下拉菜单,我需要根据下拉菜单中选择的值在此时间范围内过滤数据帧,但不知何故我被困在这里并且它给出了一个异常

"TypeError: Index must be DatetimeIndex"

df = pd.read_excel(datasource)

html.Div([
        html.Label("Please select a day", style={'textAlign': "center"}),
        dcc.Dropdown(
            id='daydropdown',
            options=[{'label': i, 'value': i} for i in dropdownDate],
            multi=False
        ),
        html.Label("Please select a start time", style={'textAlign': "center"}),
        dcc.Dropdown(
            id='starttimedropdown',
            options=[{'label': i, 'value': i} for i in dropdownStartTime],
            multi=False
        ),
        html.Label("Please select an end time", style={'textAlign': "center"}),
        dcc.Dropdown(
            id='endtimedropdown',
            options=[{'label': i, 'value': i} for i in dropdownEndTime],
            multi=False
        ),
])


@app.callback(
    Output('availability graph', 'figure'),
    [Input('daydropdown', 'value'),
     Input('starttimedropdown', 'value'),
     Input('endtimedropdown', 'value'),
     Input('vehicletype', 'value')]
)
def update_graph(selectedday, selectedstarttime, selectedendtime, selectedvehicletype):
    # get all the parking spaces for the selected day and for the selected vehicle type
    df1 = df[(df["Datum"] == selectedday) & (df["Klassifikation"] == selectedvehicletype)]
    # filter parking spaces by the time range selected
    start = pd.to_datetime(selectedstarttime)
    end = pd.to_datetime(selectedendtime)
    df2 = df1[df1['Uhrzeit'].between_time(start, end)]

我希望df2根据选择的开始和结束时间进行过滤,但是这一行抛出异常,df2 = df1[df1['Uhrzeit'].between_time(start, end)]

所选时间的格式为HH:MM:SS

Uhrzeit 的格式不是日期时间,而只是一个对象(它错过了日期)。即使这样格式化时间字符串 selectedstarttimeselectedendtime 也是可能的,因为 pandas 将今天的日期放在时间部分的前面:

pd.to_datetime('08:22:22') = Timestamp('2019-08-06 08:22:22')

如果您想使用 between_time,请确保您正在检查的对象是日期时间对象。函数中的参数可以写成HH:MM,不必是datetime:

df2['Urhzeit'].between_time('0:15', '0:45')