Pandas 未按要求设置日期格式

Pandas is not formatting the date as asked

提问人:Assad Rajab 提问时间:11/16/2023 更新时间:11/16/2023 访问量:54

问:

我有一个专栏叫做 Pausetime,另一个专栏叫做 Worktime。
它们都是字符串,看起来像这样:“02:28:49”。
我想将它们从字符串转换为日期对象;但是,请保持我使用以下行的格式
%H%M%S

# define the format of the time columns
time_format = "%H:%M:%S"

# convert the time columns
df["Pausetime"] = pd.to_datetime(df["Pausetime"], format=time_format)
df["Worktime"]  = pd.to_datetime(df["Worktime"],  format=time_format)

print(df["Worktime"])

但是,输出与传递的time_format

1   1900-01-01 02:28:49
2   1900-01-01 04:47:45
3   1900-01-01 04:49:09
4   1900-01-01 02:46:47
Name: Worktime, dtype: datetime64[ns]

关于如何实现这一目标的任何提示?
我是 Pandas 的新手,在这个问题上有点迷茫。

原因是我稍后在Excel中计算时间,显然,它仅在单元格为日期格式时才有效。

Python 熊猫

评论


答:

0赞 Achille G 11/16/2023 #1

在 pd.to_datetime() 中,format 参数用于指定您尝试转换为 pandas Datetime 对象的输入日期时间字符串的格式。通过提供正确的格式,可以确保 pandas 可以正确分析字符串并将其转换为 datetime 对象。

要更改 pandas Datetime 对象的格式,您可以使用 strftime() 方法,如下所示:

import pandas as pd

datetime_obj = pd.to_datetime("2021-09-30 10:15:30")

formatted_time = datetime_obj.strftime("%H:%M:%S")
print(formatted_time)

评论

0赞 Assad Rajab 11/16/2023
这种方法可以一次应用于整个色谱柱吗?
1赞 Achille G 11/16/2023
确定!df['time_formatted'] = df['datetime'].dt.strftime("%H:%M:%S")
1赞 jezrael 11/16/2023
顺便说一句,此解决方案创建字符串列。
1赞 jezrael 11/16/2023 #2

如果需要只有时间而没有日期的 datetimes 对象,这在 python 中是不可能的。

您可以将值转换为时间:

df["Pausetime"] = pd.to_datetime(df["Pausetime"], format=time_format).dt.time
df["Worktime"]  = pd.to_datetime(df["Worktime"],  format=time_format).dt.time

print (df['Worktime'])
0    02:28:49
1    04:47:45
2    04:49:09
Name: Worktime, dtype: object

或者到时间增量,但格式不同:

df["Pausetime"] = pd.to_timedelta(df["Pausetime"])
df["Worktime"]  = pd.to_timedelta(df["Worktime"])

print (df['Worktime'])
0   0 days 02:28:49
1   0 days 04:47:45
2   0 days 04:49:09
Name: Worktime, dtype: timedelta64[ns]

评论

0赞 Assad Rajab 11/16/2023
这是一个很好的答案;但是,类型不能是 String(object) 由于某种原因,excel 在计算时间时遇到问题,如果它是字符串。
1赞 jezrael 11/16/2023
@AssadRajab - 尝试 s,它应该运行良好timedelta
0赞 Assad Rajab 11/16/2023
明白了;它可以工作,但在输出的 Excel 文件(通过 xlsxwriter 生成)中,时间显示为 0,但如果手动格式化为 hh-mm-ss,则它有一个初始值。你能提出什么建议来解决这个问题吗?
0赞 jezrael 11/16/2023
@AssadRajab - 在输出中是格式喜欢的,需要将其转换为?0 days 04:49:0904:49:09
1赞 Assad Rajab 11/16/2023
使用打印,它是输出;一旦我把它写到Excel,单元格显示0。如果我手动将该单元格(在Excel中)格式化为日期格式,则显示.我认为这是一个 xlsxwritter 格式问题,而不是数据帧格式问题。0 days 04:49:0904:49:09
0赞 erogluegemen 11/16/2023 #3

!更新!

注意:在应用以下解决方案之前,我假设这些列中没有任何缺失值。否则,这可能是问题所在。在这种情况下,您可以执行如下操作:

time_format = "%H:%M:%S"
df["Pausetime"] = pd.to_datetime(df["Pausetime"], format=time_format, errors='coerce')
df["Worktime"] = pd.to_datetime(df["Worktime"], format=time_format, errors='coerce')

转换为日期时间后,您可以尝试使用我认为它会解决您的问题。 喜欢这个:.dt.strftime

time_format = "%H:%M:%S"

df["Pausetime"] = pd.to_datetime(df["Pausetime"], format=time_format)
df["Worktime"] = pd.to_datetime(df["Worktime"], format=time_format)

#df["Pausetime"] = df["Pausetime"].dt.strftime(time_format)
#df["Worktime"] = df["Worktime"].dt.strftime(time_format)

df["Pausetime"] = pd.to_timedelta(df["Pausetime"].dt.strftime("%H:%M:%S"))
df["Worktime"] = pd.to_timedelta(df["Worktime"].dt.strftime("%H:%M:%S"))

我希望这会奏效。干杯!

评论

1赞 Assad Rajab 11/16/2023
感谢您提及缺失的值。在应用此方法之前,我确实准备了数据。无论如何,你的答案非常好。但是,它会创建字符串列,这在以后计算时间时会造成困难。