删除timedelta对象中的日期

时间:2018-11-03 09:18:42

标签: python pandas datetime timedelta

我在熊猫dataframe中有一列,该列是减去两次后创建的。我现在有一个timedelta这样的-1 days +02:45:00对象。我只需要删除-1天,并希望它为02:45:00。有办法吗?

5 个答案:

答案 0 :(得分:1)

我认为您可以减去days转换为时间增量的时间:

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'>

或将时间增量转换为字符串并提取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'>

答案 1 :(得分:0)

如果您的列名为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并从中提取时间。

答案 2 :(得分:0)

我为可能遇到此问题的其他人找到了一个非常简单的解决方案:

if timedelta_obj.days < 0:
    timedelta_obj.days = datetime.timedelta(
        seconds=timedelta_obj.total_seconds() + 3600*24)

答案 3 :(得分:0)

我认为您想要做的是在忽略日期的同时减去两个时间戳。一种简单的方法是将两个时间戳记设置为负前相同的日期。

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')

答案 4 :(得分:0)

我发现这个方法很简单,其他人不适合我

df['column'] = df['column'].astype(str).map(lambda x: x[7:])

它分割了日子的一部分,而你只得到时间的一部分