如何将 python 内的天数转换为小时数
How to convert No of days to Hours in python
我有一个Age.xlsx,我在其中计算事件发生的天数(我必须找到以小时为单位的粒度级别)我遇到了一种情况,我必须计算天数满足以下两个条件。
- 如果给出完成日期则天数=完成日期-提交日期
- 如果完成日期为 NaT(或空白)(如果事件仍在处理中,则 天数=L1+L2
此外,如何将天数转换为小时数,例如。 “2 天 08:00:00”到“56 小时”?
示例数据:
Incident Status Priority Team Submit Date Completed Date L1 L2 No_of_days Age_in_Hours
INC0011 Pending Medium L2 2020-06-04 00:00:00 1 1
INC0012 completed High L2 2020-06-04 00:00:00 2020-06-08 02:00:00 2 2
INC0013 In progress Low L1 2020-06-05 00:00:00 1 2
INC0014 Assigned Medium L1 2020-06-05 00:00:00 1 3
INC0015 completed High L2 2020-06-05 00:00:00 2020-06-05 01:00:00 0 1
示例代码:
data = pd.read_excel('C:\Age.xlsx')
x=(data['Completed Date']- data['Submit Date'])
答案如下:
a) 如果给出完成日期则天数=完成日期-提交日期
df['No_of_days'] = df['Completed Date'] - df['Submit Date']
b) 此外,如何将天数转换为小时数,例如。 “2 天 08:00:00”到“56 小时”?
df['hours'] = df['No_of_days'] / pd.Timedelta('1 hour')
c) 如果完成日期为 NaT(或空白)(如果事件仍未完成,则天数 = L1+L2(小时比日期更容易。)
我找到的最简单的方法是使用 np.where
,它基本上是数组的 if
语句。你可以查看更好的解释 here.
import numpy as np
df['hours'] = np.where(df['hours'].isnull(), df['L1'] + df['L2'], df['hours'])
您可以根据是否填写完成日期列创建一个布尔掩码,并使用loc
有条件地填写天数列:
- 如果有完成日期,则用完成日期减去开始日期
- 不是,取
L1
和 L2
的总和,然后 pandas.Timedelta
这么多天
这将使 "No_of_days"
列全部为 Timedelta
,然后您可以轻松地将其按除法转换为小时数:
#mask is where "Completed Date" is null
mask = df['Completed Date'].isnull()
df.loc[~mask, 'No_of_days'] = df['Completed Date'][~mask] - df['Submit Date'][~mask]
df.loc[mask, 'No_of_days'] = pd.to_timedelta(df['L1'][mask] + df['L2'][mask], unit='days')
df['Age_in_Hours'] = df['No_of_days']/pd.Timedelta(hours=1)
请注意,有完整日期的时间和没有完整日期的时间在精度上存在差异(因为 L1
和 L2
不提供小时数)。
我有一个Age.xlsx,我在其中计算事件发生的天数(我必须找到以小时为单位的粒度级别)我遇到了一种情况,我必须计算天数满足以下两个条件。
- 如果给出完成日期则天数=完成日期-提交日期
- 如果完成日期为 NaT(或空白)(如果事件仍在处理中,则 天数=L1+L2
此外,如何将天数转换为小时数,例如。 “2 天 08:00:00”到“56 小时”?
示例数据:
Incident Status Priority Team Submit Date Completed Date L1 L2 No_of_days Age_in_Hours
INC0011 Pending Medium L2 2020-06-04 00:00:00 1 1
INC0012 completed High L2 2020-06-04 00:00:00 2020-06-08 02:00:00 2 2
INC0013 In progress Low L1 2020-06-05 00:00:00 1 2
INC0014 Assigned Medium L1 2020-06-05 00:00:00 1 3
INC0015 completed High L2 2020-06-05 00:00:00 2020-06-05 01:00:00 0 1
示例代码:
data = pd.read_excel('C:\Age.xlsx')
x=(data['Completed Date']- data['Submit Date'])
答案如下:
a) 如果给出完成日期则天数=完成日期-提交日期
df['No_of_days'] = df['Completed Date'] - df['Submit Date']
b) 此外,如何将天数转换为小时数,例如。 “2 天 08:00:00”到“56 小时”?
df['hours'] = df['No_of_days'] / pd.Timedelta('1 hour')
c) 如果完成日期为 NaT(或空白)(如果事件仍未完成,则天数 = L1+L2(小时比日期更容易。)
我找到的最简单的方法是使用 np.where
,它基本上是数组的 if
语句。你可以查看更好的解释 here.
import numpy as np
df['hours'] = np.where(df['hours'].isnull(), df['L1'] + df['L2'], df['hours'])
您可以根据是否填写完成日期列创建一个布尔掩码,并使用loc
有条件地填写天数列:
- 如果有完成日期,则用完成日期减去开始日期
- 不是,取
L1
和L2
的总和,然后pandas.Timedelta
这么多天
这将使 "No_of_days"
列全部为 Timedelta
,然后您可以轻松地将其按除法转换为小时数:
#mask is where "Completed Date" is null
mask = df['Completed Date'].isnull()
df.loc[~mask, 'No_of_days'] = df['Completed Date'][~mask] - df['Submit Date'][~mask]
df.loc[mask, 'No_of_days'] = pd.to_timedelta(df['L1'][mask] + df['L2'][mask], unit='days')
df['Age_in_Hours'] = df['No_of_days']/pd.Timedelta(hours=1)
请注意,有完整日期的时间和没有完整日期的时间在精度上存在差异(因为 L1
和 L2
不提供小时数)。