数数天,但以给定的小时数开始

时间:2019-06-26 04:37:27

标签: python pandas datetime time

我有一个这种格式的表:

import subprocess

params = ['param1', 'param2']  # POWERSHELL SCRIPT PARAMETERS ( optional )
script_path = "C:\\PowershellScripts\\test.PS1"  # POWERSHELL SCRIPT PATH
commandline_options = ["Powershell.exe", '-ExecutionPolicy', 'Unrestricted', script_path]  # INITIALIZING COMMAND
for param in params:  # FOREACH LOOP OF PARAMETERS
    commandline_options.append(param)  # ADDING SCRIPT PARAMETERS TO THE COMMAND

result = subprocess.run(commandline_options, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = True)  # RUN THE SCRIPT USING SUBPROCESS WITH PARAMS

print(result.returncode)  # PRINT THE RETURN CODE FROM POWERSHELL SCRIPT
print(result.stdout)  # PRINT THE STANDARD OUTPUT FROM POWERSHELL SCRIPT
print(result.stderr)  # PRINT THE STANDARD ERROR FROM POWERSHELL SCRIPT

我想做的是计算表中的天数(从1开始),而不是从午夜开始,我希望我的日子从10:00:00开始 >。因此,对于上表,结果将是:

                 date
0 2017-03-30 09:59:00
1 2017-03-30 09:59:30
2 2017-03-30 10:00:00
3 2017-03-30 10:00:30
4 2017-03-30 10:01:00
5 2017-03-30 10:01:30
6 2017-03-30 10:02:00

到目前为止,我设法用以下代码生成了新列:

                 date  day
0 2017-03-30 09:59:00    0
1 2017-03-30 09:59:30    0
2 2017-03-30 10:00:00    1
3 2017-03-30 10:00:30    1
4 2017-03-30 10:01:00    1
5 2017-03-30 10:01:30    1
6 2017-03-30 10:02:00    1

但是我希望有一种更优雅(更重要的是,更快)的方式来执行此操作。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

如果将数据后退10小时,然后按天对行进行分组怎么办?然后,您可以在日期上使用pd.factorize,这应该很快。

df['day'] = pd.factorize((df['date'] - pd.Timedelta(hours=10)).dt.date)[0]
df
                 date  day
0 2017-03-30 09:59:00    0
1 2017-03-30 09:59:30    0
2 2017-03-30 10:00:00    1
3 2017-03-30 10:00:30    1
4 2017-03-30 10:01:00    1
5 2017-03-30 10:01:30    1
6 2017-03-30 10:02:00    1

GroupBy.ngroup是另一种选择:

df['day'] = df.groupby((df['date'] - pd.Timedelta(hours=10)).dt.date).ngroup()
df
                 date  day
0 2017-03-30 09:59:00    0
1 2017-03-30 09:59:30    0
2 2017-03-30 10:00:00    1
3 2017-03-30 10:00:30    1
4 2017-03-30 10:01:00    1
5 2017-03-30 10:01:30    1
6 2017-03-30 10:02:00    1