删除 timedelta 对象中的天数
Posted
技术标签:
【中文标题】删除 timedelta 对象中的天数【英文标题】:Remove the days in the timedelta object 【发布时间】:2019-04-07 08:54:20 【问题描述】:我在熊猫dataframe
中有一个列,它是在减去两次后创建的。我现在有一个像 -1 days +02:45:00
这样的 timedelta
对象。我只需要删除 -1 天并希望它是02:45:00
。有没有办法做到这一点?
【问题讨论】:
我认为this 回答了你的问题。 【参考方案1】:我认为你可以减去 days
转换为 timedeltas:
td = pd.to_timedelta(['-1 days +02:45:00','1 days +02:45:00','0 days +02:45:00'])
df = pd.DataFrame('td': td)
df['td'] = df['td'] - pd.to_timedelta(df['td'].dt.days, unit='d')
print (df.head())
td
0 02:45:00
1 02:45:00
2 02:45:00
print (type(df.loc[0, 'td']))
<class 'pandas._libs.tslibs.timedeltas.Timedelta'>
或者将timedeltas转换为字符串,提取days
和.
之间的字符串:
df['td'] = df['td'].astype(str).str.extract('days (.*?)\.')
print (df.head())
td
0 +02:45:00
1 02:45:00
2 02:45:00
print (type(df.loc[0, 'td']))
<class 'str'>
【讨论】:
太棒了!谢谢【参考方案2】:如果您的列名为 time1,您可以这样做:
import pandas as pd
import datetime as dt
df['time1'] = pd.to_datetime(str(df.time1)[11:19]) #this slice can be adjusted
df['time1'] = df.time1.dt.time
这会将 timedelta 转换为 str,从中分割时间部分,将其转换为 datetime 并从中提取时间。
【讨论】:
【参考方案3】:我为可能遇到此问题的其他人找到了一个非常简单的解决方案:
if timedelta_obj.days < 0:
timedelta_obj.days = datetime.timedelta(
seconds=timedelta_obj.total_seconds() + 3600*24)
【讨论】:
【参考方案4】:我认为您想要做的是在忽略日期的同时减去两个时间戳。一种简单的方法是在减号之前将两个时间戳设置为相同的日期。
import pandas as pd
start_time = pd.Timestamp(2007, 12, 5, 21, 24, 36)
end_time = pd.Timestamp(2007, 12, 6, 20, 24, 36)
start_time - end_time # which returns Timedelta('-1 days +01:00:00')
您可以做的只是将 end_time 设置为与 start_time 相同的日期:
import pandas as pd
start_time = pd.Timestamp(2007, 12, 5, 21, 24, 36)
end_time = pd.Timestamp(2007, 12, 6, 20, 24, 36)
end_time = end_time.replace(year=start_time.year, month=start_time.month, day=start_time.day)
start_time - end_time # which returns Timedelta('0 days +01:00:00')
【讨论】:
【参考方案5】:我发现这个方法很简单,其他人不适合我
df['column'] = df['column'].astype(str).map(lambda x: x[7:])
它分割了日子部分,你只得到时间部分
【讨论】:
以上是关于删除 timedelta 对象中的天数的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用dataframe中的两列时间对象数据列作差生成时间差数据列将时间差(timedelta对象)与特定时间长度进行比较