Python 以HH:MM:SS格式高效地将整数列转换为时间

Python 以HH:MM:SS格式高效地将整数列转换为时间,python,pandas,loops,Python,Pandas,Loops,我正在尝试开发一个更有效的循环,以完成一个问题。此时,如果下面的代码与特定值对齐,则会应用一个字符串。但是,这些值的顺序是相同的,因此循环可以提高此过程的效率 以下面的df为例,使用整数表示时间段,每增加一个整数等于15分钟。所以1==8:00:00和2==8:15:00等等。此时,我将重复这个过程,直到最后一个时间段。如果达到80,效率可能会非常低。这里是否可以合并循环 import pandas as pd d = ({ 'Time' : [1,1,1,2,2,2,3,3,3

我正在尝试开发一个更有效的
循环
,以完成一个问题。此时,如果下面的代码与特定值对齐,则会应用一个
字符串。但是,这些值的顺序是相同的,因此
循环
可以提高此过程的效率

以下面的
df
为例,使用
整数
表示时间段,每增加一个整数等于15分钟。所以
1==8:00:00
2==8:15:00
等等。此时,我将重复这个过程,直到最后一个时间段。如果达到
80
,效率可能会非常低。这里是否可以合并
循环

import pandas as pd

d = ({
    'Time' :    [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6],
})

df = pd.DataFrame(data = d)

def time_period(row) :
   if row['Time'] == 1 :
      return '8:00:00'
   if row['Time'] == 2 :
       return '8:15:00'
   if row['Time'] == 3 :
      return '8:30:00'
   if row['Time'] == 4 :
      return '8:45:00'
   if row['Time'] == 5 :
      return '9:00:00'
   if row['Time'] == 6 :
      return '9:15:00'       
   .....
   if row['Time'] == 80 :
      return '4:00:00'      

df['24Hr Time'] = df.apply(lambda row: time_period(row), axis=1)

print(df)
输出:


一般来说,您需要制作一本词典并应用

my_dict = {'old_val1': 'new_val1',...}
df['24Hr Time'] = df['Time'].map(my_dict)
但是,在这种情况下,您可以使用时间增量:

df['24Hr Time'] = pd.to_timedelta(df['Time']*15, unit='T') + pd.to_timedelta('7:45:00')
输出(请注意,新列的类型为
timedelta
,而不是字符串)


这可以通过一些简单的timdelta算法实现:

df['24Hr Time'] = (
    pd.to_timedelta((df['Time'] - 1) * 15, unit='m') + pd.Timedelta(hours=8))
df.head()

   Time 24Hr Time
0     1  08:00:00
1     1  08:00:00
2     1  08:00:00
3     2  08:15:00
4     2  08:15:00

df.dtypes

Time                   int64
24Hr Time    timedelta64[ns]
dtype: object

如果需要字符串,请使用带有单位和原点的
pd.to_datetime

df['24Hr Time'] = (
    pd.to_datetime((df['Time']-1) * 15, unit='m', origin='8:00:00')
      .dt.strftime('%H:%M:%S'))
df.head()

   Time 24Hr Time
0     1  08:00:00
1     1  08:00:00
2     1  08:00:00
3     2  08:15:00
4     2  08:15:00

df.dtypes

Time          int64
24Hr Time    object
dtype: object
最后我用了这个

pd.to_datetime((df.Time-1)*15*60+8*60*60,unit='s').dt.time
0     08:00:00
1     08:00:00
2     08:00:00
3     08:15:00
4     08:15:00
5     08:15:00
6     08:30:00
7     08:30:00
8     08:30:00
9     08:45:00
10    08:45:00
11    08:45:00
12    09:00:00
13    09:00:00
14    09:00:00
15    09:15:00
16    09:15:00
17    09:15:00
Name: Time, dtype: object

一个有趣的方法是使用
pd.timedelta_范围
索引。重复

n = df.Time.nunique()
c = df.groupby('Time').size()
df['24_hr'] = pd.timedelta_range(start='8 hours', periods=n, freq='15T').repeat(c)

Out[380]:
    Time    24_hr
0      1 08:00:00
1      1 08:00:00
2      1 08:00:00
3      2 08:15:00
4      2 08:15:00
5      2 08:15:00
6      3 08:30:00
7      3 08:30:00
8      3 08:30:00
9      4 08:45:00
10     4 08:45:00
11     4 08:45:00
12     5 09:00:00
13     5 09:00:00
14     5 09:00:00
15     6 09:15:00
16     6 09:15:00
17     6 09:15:00

我甚至都没有想到这一点。回答得很好。@jonboy使用
添加了另一个解决方案到\u datetime
。这使您可以将输出作为字符串,而不是时间增量。@cs95如果时间间隔超过24小时,
to_datetime
解决方案可能会产生错误吗?@QuangHoang使用
df=pd.DataFrame({'time':np.arange(1,101)})尝试了它,它似乎工作正常。如果您发现了什么,请告诉我。@QuangHoang我打赌timedelta方法“不太正确”,因为附加天数部分(可以删除)。
to_datetime
方法似乎在相同的时间间隔内循环,而不增加天数。
pd.to_datetime((df.Time-1)*15*60+8*60*60,unit='s').dt.time
0     08:00:00
1     08:00:00
2     08:00:00
3     08:15:00
4     08:15:00
5     08:15:00
6     08:30:00
7     08:30:00
8     08:30:00
9     08:45:00
10    08:45:00
11    08:45:00
12    09:00:00
13    09:00:00
14    09:00:00
15    09:15:00
16    09:15:00
17    09:15:00
Name: Time, dtype: object
n = df.Time.nunique()
c = df.groupby('Time').size()
df['24_hr'] = pd.timedelta_range(start='8 hours', periods=n, freq='15T').repeat(c)

Out[380]:
    Time    24_hr
0      1 08:00:00
1      1 08:00:00
2      1 08:00:00
3      2 08:15:00
4      2 08:15:00
5      2 08:15:00
6      3 08:30:00
7      3 08:30:00
8      3 08:30:00
9      4 08:45:00
10     4 08:45:00
11     4 08:45:00
12     5 09:00:00
13     5 09:00:00
14     5 09:00:00
15     6 09:15:00
16     6 09:15:00
17     6 09:15:00