如何在 Python 的 pandas DataFrame 中 select 一个时间范围?

How to select a time range in a pandas DataFrame in Python?

我有一个关于 select 在 Python 的 pandas DataFrame 中设置范围的问题。我有一个包含时间的列和一个包含值的列。我想 select 所有时间在 6 a.m 之间的行。和 6 p.m。 (所以从 6:00:00 到 18:00:00)。我已经成功地 select 整晚(在 18:00:00 和 6:00:00 之间),但是如果我将相同的方法应用到白天,它就不起作用了。我的语法有问题吗?下面是一个最小的工作示例。 timeslice2 returns 在我的例子中是一个空的 DataFrame。

import pandas as pd

times = ("1:00:00", "2:00:00", "3:00:00", "4:00:00", "5:00:00", "6:00:00", "7:00:00", "8:00:00", "9:00:00", \
         "10:00:00", "11:00:00", "12:00:00", "13:00:00", "14:00:00", "15:00:00", "16:00:00", "17:00:00", \
         "18:00:00", "19:00:00", "20:00:00", "21:00:00", "22:00:00", "23:00:00")

values = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)

data = zip(times, values)

colnames = ["Time", "values"]

df = pd.DataFrame(data=data, columns=colnames)

print(df)

# selecting only night times
timeslice1 = df[(df['Time'] > '18:00:00') & (df['Time'] <= '6:00:00')]

# selecting only day times
timeslice2 = df[(df['Time'] > '6:00:00') & (df['Time'] <= '18:00:00')]

print(timeslice1)
print(timeslice2)

我已经能够 select 使用 的正确范围,但我觉得上面的方法不起作用,这对我来说似乎很奇怪。此外,如果我根据需要将 'Time' 列转换为 'datetime',它会使用今天的日期,而我不希望这样。

这样就可以了,如果像日期时间一样处理第一个范围则没有结果,因为它意味着按时间顺序排列的两个不同的日期(天)。

import pandas as pd

times = ("1:00:00", "2:00:00", "3:00:00", "4:00:00", "5:00:00", "6:00:00", "7:00:00", "8:00:00", "9:00:00", \
         "10:00:00", "11:00:00", "12:00:00", "13:00:00", "14:00:00", "15:00:00", "16:00:00", "17:00:00", \
         "18:00:00", "19:00:00", "20:00:00", "21:00:00", "22:00:00", "23:00:00")

values = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)

data = zip(times, values)

colnames = ["Time", "values"]

df = pd.DataFrame(data=data, columns=colnames)

print('Original df \n',df)

# selecting only night times
timeslice1 = df[(df['Time'] > '18:00:00') & (df['Time'] <= '6:00:00')]

# selecting only day times
#conver Time column to datetime    
df['Time'] = pd.to_datetime(df['Time'])
timeslice2 = df[(df['Time'] > '6:00:00') & (df['Time'] <= '18:00:00')]
#convert df back to string
timeslice2["Time"] = timeslice2["Time"].dt.strftime('%H:%M:%S')

print('Slice 1 \n', timeslice1)
print('Slice 2 \n', timeslice2)