提问人:Assad Rajab 提问时间:11/16/2023 更新时间:11/16/2023 访问量:54
Pandas 未按要求设置日期格式
Pandas is not formatting the date as asked
问:
我有一个专栏叫做 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中计算时间,显然,它仅在单元格为日期格式时才有效。
答:
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:09
04:49:09
1赞
Assad Rajab
11/16/2023
使用打印,它是输出;一旦我把它写到Excel,单元格显示0。如果我手动将该单元格(在Excel中)格式化为日期格式,则显示.我认为这是一个 xlsxwritter 格式问题,而不是数据帧格式问题。0 days 04:49:09
04: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
感谢您提及缺失的值。在应用此方法之前,我确实准备了数据。无论如何,你的答案非常好。但是,它会创建字符串列,这在以后计算时间时会造成困难。
评论