我想将数据框中的列转换为'12:51 AM'之类的值为'01'(相当于'01:00'的24小时时钟时间)。是的,我想将它四舍五入到最近的一小时。
例如,假设我的DataFrame是:
Time
12:51 AM
1:51 AM
2:03 AM
4:23 PM
我想将其更改为:
Time
01
02
02
16
我的方法:
首先,将每个字符串(比如'12:51 AM')分成两部分 - '12:51'和'AM'。 然后,使用循环,如果实现这一点。
我正在寻找更有效的方法,比如使用datetime包。
非常感谢。
答案 0 :(得分:1)
time.strptime()
符合您的需求。
from time import strptime
def transform(data_frame):
time = strptime(data_frame, "%I:%M %p")
hour = time.tm_hour
if time.tm_min >= 30:
if hour < 23:
hour += 1
else:
hour = 0
return hour
values = "12:51 AM", "1:51 AM", "2:03 AM", "4:23 PM"
for value in values:
print(transform(value))
输出:
1
2
2
16
希望它有所帮助!
答案 1 :(得分:1)
现有答案没有任何问题,但他们没有使用任何内置的熊猫解决方案,这可以使事情变得更容易。如果您从字符串格式的东西开始,您可以转换为datetime,然后使用pandas dt
来提取小时数等。
df['Time2'] = pd.to_datetime(df.Time)
Time Time2
0 12:51 AM 2015-04-20 00:51:00
1 1:51 AM 2015-04-20 01:51:00
2 2:03 AM 2015-04-20 02:03:00
3 4:23 PM 2015-04-20 16:23:00
现在你可以提取小时/分钟等。使用dt
方法很容易。
df['Time2'].dt.hour + df['Time2'].dt.minute.div(30).astype(int)
0 1
1 2
2 2
3 16
有用的文档:
答案 2 :(得分:0)
我同意cdonts。这是一个pythonic解决方案
from time import strptime as st
times = "12:51 AM", "1:51 AM", "2:03 AM", "4:23 PM"
for time in times:
print(st(time, '%I:%M %p').tm_hour+st(time, '%I:%M %p').tm_min//30)
根据您的需要,您可能希望将结果存储在列表(或您选择的数据类型)中
times = [st(time, '%I:%M %p').tm_hour+st(time, '%I:%M %p').tm_min//30 for time in("12:51 AM", "1:51 AM", "2:03 AM", "4:23 PM")]
目前尚不清楚您将从哪里抽出时间。如果它们不是用户输入并存储在某处以供以后检索,您可能需要编写一个检索值的函数并返回一个可以像这样使用的列表
times = [st(time, '%I:%M %p').tm_hour+st(time, '%I:%M %p').tm_min//30 for time in retrieve(args)]
希望这有帮助