如何使用python获取一列数据中包含的特定行的时间差

问题描述 投票:0回答:2

这里我有一个包含时间和三个输入的数据集。这里我用panda来计算时差。

代码是:

data['Time_different'] = pd.to_timedelta(data['time'].astype(str)).diff(-1).dt.total_seconds().div(60)

这是读取每行的时间差。但我想编写一个代码来仅查找具有 X3 值的特定行的时间差。

我尝试使用for循环编写代码。但它不能正常工作。不使用for循环我们可以写代码吗?

enter image description here

正如您在我的图像中看到的,我有三个输入:X1、X2、X3。在这里,当我使用该代码时,它显示了 X1、X2、X3 的时间差。

这里我想写的是获取具有值的 X3 输入的时间差。

time      X3

6:00:00		0
7:00:00		2
8:00:00		0
9:00:00		50
10:00:00	0
11:00:00	0
12:00:00	0
13:45:00	0
15:00:00	0
16:00:00	0
17:00:00	0
18:00:00	0
19:00:00	20

那么这里我想跳过X3值为0的时间,只想读取X3值的时间差。

time             x3

7:00:00          2(values having)
9:00:00          50

所以时差是

2hrs

然后第二个:

9:00:00          50
19:00:00         20

那么时差是

10 hrs

同样,我想编写代码或我的整个专栏。谁能帮我解决这个问题吗?

输入代码时会得到时间差为负值的错误。

enter image description here

python python-3.x pandas time
2个回答
2
投票

您可以尝试:

  • 查找
    X3
    与 0 不同的行
  • 使用
    shift
  • 计算差异为小时
  • 使用
    join
    更新数据框:

完整示例:

data = """time      X3
6:00:00     0
7:00:00     2
8:00:00     0
9:00:00     50
10:00:00    0
11:00:00    0
12:00:00    0
13:45:00    0
15:00:00    0
16:00:00    0
17:00:00    0
18:00:00    0
19:00:00    20"""
# Build dataframe from example
df = pd.read_csv(StringIO(data), sep=r'\s{1,}')
df['X1'] = np.random.randint(0,10,len(df))   # Add random values for "X1" column
df['X2'] = np.random.randint(0,10,len(df))   # Add random values for "X2" column

# Convert the time column to datetime object
df.time = pd.to_datetime(df.time, format="%H:%M:%S")
print(df)
#                   time  X3  X1  X2
# 0  1900-01-01 06:00:00   0   5   4
# 1  1900-01-01 07:00:00   2   7   1
# 2  1900-01-01 08:00:00   0   2   8
# 3  1900-01-01 09:00:00  50   1   0
# 4  1900-01-01 10:00:00   0   3   9
# 5  1900-01-01 11:00:00   0   8   4
# 6  1900-01-01 12:00:00   0   0   2
# 7  1900-01-01 13:45:00   0   5   0
# 8  1900-01-01 15:00:00   0   5   7
# 9  1900-01-01 16:00:00   0   0   8
# 10 1900-01-01 17:00:00   0   6   7
# 11 1900-01-01 18:00:00   0   1   5
# 12 1900-01-01 19:00:00  20   4   7

# Compute difference
sub_df = df[df.X3 != 0]
out_values = (sub_df.time.dt.hour - sub_df.shift().time.dt.hour) \
            .to_frame() \
            .fillna(sub_df.time.dt.hour.iloc[0]) \
            .rename(columns={'time': 'out'})  # Rename column
print(out_values)
#      out
# 1    7.0
# 3    2.0
# 12  10.0

df = df.join(out_values)                # Add out values
print(df)
#                   time  X3  X1  X2   out
# 0  1900-01-01 06:00:00   0   2   9   NaN
# 1  1900-01-01 07:00:00   2   7   4   7.0
# 2  1900-01-01 08:00:00   0   6   6   NaN
# 3  1900-01-01 09:00:00  50   9   1   2.0
# 4  1900-01-01 10:00:00   0   2   9   NaN
# 5  1900-01-01 11:00:00   0   5   3   NaN
# 6  1900-01-01 12:00:00   0   6   4   NaN
# 7  1900-01-01 13:45:00   0   9   3   NaN
# 8  1900-01-01 15:00:00   0   3   0   NaN
# 9  1900-01-01 16:00:00   0   1   8   NaN
# 10 1900-01-01 17:00:00   0   7   5   NaN
# 11 1900-01-01 18:00:00   0   6   7   NaN
# 12 1900-01-01 19:00:00  20   1   5  10.0

这里使用

.fillna(sub_df.time.dt.hour.iloc[0])
将第一个值替换为匹配的小时数(因为减 0 没有任何作用)。您可以为
fillna()
中的值定义自己的规则。


0
投票

time      X3

6:00:00     0
7:00:00     2
8:00:00     0
9:00:00     50
10:00:00    0
11:00:00    0
12:00:00    0
13:45:00    0
15:00:00    0
16:00:00    0
17:00:00    0
18:00:00    0
19:00:00    20

© www.soinside.com 2019 - 2024. All rights reserved.