删除 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 对象中的天数的主要内容,如果未能解决你的问题,请参考以下文章

从 TimeDelta 到 Pandas 中的浮动天数

从 numpy.timedelta64 值中提取天数

如何计算两个给定日期之间的天数

pandas使用dataframe中的两列时间对象数据列作差生成时间差数据列将时间差(timedelta对象)与特定时间长度进行比较

Python日期时间差的计算(天/小时/分钟)及timedelta函数的使用(附python代码)

TypeError:不支持的操作数类型/:'float'和'datetime.timedelta'