我有一个df
,其中一个column
以秒为单位显示时间。我想将它们转换为hh:mm
或hh:mm:ss
。
如果时间超过标准的24小时,我仍希望它位于hh:mm:ss
中。不是'n' days hh:mm:ss
。
举个例子:
import pandas as pd
import numpy as np
import datetime
ts1 = ['21000', np.nan, '40000', np.nan, '49000', '100000']
ts2 = [0, 2, 'yy', 3, 'yy', 'yy']
ts3 = [0, 2, np.nan, 3, 4, np.nan]
d = {'X': ts1, 'Y': ts2, 'Z': ts3}
df = pd.DataFrame(data=d)
输出:
X Y Z
0 21000 0 0.0
1 NaN 2 2.0
2 40000 yy NaN
3 NaN 3 3.0
4 49000 yy 4.0
5 100000 yy NaN
我可以使用以下命令在单个string
上执行此操作:
t = str(datetime.timedelta(seconds=21000))
输出t:
5:50:00
但是如何将相同的函数传递给整个列?
#t_col = str(datetime.timedelta(seconds=df['ts1']))
预期输出:
X Y Z
0 5:50:00 0 0.0
1 NaN 2 2.0
2 11:06:40 yy NaN
3 Nan 3 3.0
4 13:36:40 yy 4.0
5 27:46:40 yy NaN
答案 0 :(得分:0)
更分步的方法
首先,让我们创建新列,并删除讨厌的NaN
值
In [156]: df['new_column'] = df.X.fillna(0)
In [157]: df
Out[157]:
X Y Z new_column
0 21000 0 0.0 21000
1 NaN 2 2.0 0
2 40000 yy NaN 40000
3 NaN 3 3.0 0
4 49000 yy 4.0 49000
5 80000 yy NaN 80000
然后,我们可以根据您编写的代码使用lambda
函数来创建增量。请注意,对于int
的{{1}}参数,我们必须将新列的值强制转换为seconds
s。
timedelta
使用单线纸
以我们之前的内容为基础,我们需要消除In [158]: df['new_column'] = df.apply(lambda x: datetime.timedelta(seconds=int(x['new_column'])), axis=1)
In [159]: df
Out[159]:
X Y Z new_column
0 21000 0 0.0 05:50:00
1 NaN 2 2.0 00:00:00
2 40000 yy NaN 11:06:40
3 NaN 3 3.0 00:00:00
4 49000 yy 4.0 13:36:40
5 80000 yy NaN 22:13:20
,然后首先将整个系列转换为NaN
,然后再转换为int
。
timedelta
由于In [173]: df['td'] = pd.to_timedelta(pd.to_numeric(df.X.fillna(0)), unit='s')
In [174]: df
Out[174]:
X Y Z new_column td
0 21000 0 0.0 05:50:00 05:50:00
1 NaN 2 2.0 00:00:00 00:00:00
2 40000 yy NaN 11:06:40 11:06:40
3 NaN 3 3.0 00:00:00 00:00:00
4 49000 yy 4.0 13:36:40 13:36:40
5 80000 yy NaN 22:13:20 22:13:20
非常slow,因此该方法应该更快
根据您的评论,为了与apply
保持一致,您可以使用此
NaN
答案 1 :(得分:0)
使用pandas.to_timedelta
,然后使用一些混乱的字符串格式将日期转换为小时:
def formatter(x):
x = str(x)
return str(int(x[-8:-6])+int(x.split('days')[0])*24).zfill(2) + x[-6:]
df['TD'] = pd.to_timedelta(df['X'].fillna(0).astype(int), unit='s')\
.apply(formatter)
print(df)
X Y Z TD
0 21000 0 0.0 05:50:00
1 NaN 2 2.0 00:00:00
2 40000 yy NaN 11:06:40
3 NaN 3 3.0 00:00:00
4 49000 yy 4.0 13:36:40
5 100000 yy NaN 27:46:40