【问题标题】:Remove the days in the timedelta object删除 timedelta 对象中的天数
【发布时间】:2019-04-07 08:54:20
【问题描述】:

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

【问题讨论】:

  • 我认为this 回答了你的问题。

标签: python pandas datetime timedelta


【解决方案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:])
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-30
          • 2021-02-16
          • 2022-01-21
          • 2020-01-22
          • 1970-01-01
          • 1970-01-01
          • 2016-05-31
          相关资源
          最近更新 更多