我在熊猫dataframe
中有一列,该列是减去两次后创建的。我现在有一个timedelta
这样的-1 days +02:45:00
对象。我只需要删除-1天,并希望它为02:45:00
。有办法吗?
答案 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:])
它分割了日子的一部分,而你只得到时间的一部分