关于从Excel表中重采样数据框时的时间延迟问题

-1 投票
1 回答
47 浏览
提问于 2025-04-13 16:58

我有一个Excel表格。第一列是时间数据,从22:47:52开始,到3:51:30结束,每30秒一个数据点。第二列是体温数据。这个表格的一部分在图片中显示。

我想把数据重新采样,每秒一个数据点,从22:48:00开始,体温数据也从22:48:00开始。但是,输出的结果却是从00:00:00开始,每秒一个数据点,体温数据也是从00:00:00开始。

我尝试的代码是这样的。

import pandas as pd

#path to the excel file
df = pd.read_excel(R"C:\Users\XXX.xlsx", sheet_name="XXX", usecols=[0, 1], index_col=[0], skiprows=[0, 1])

df.index = pd.to_datetime(df.index, format='%H:%M:%S')

df_upsampled = df.resample("1s", origin='start').asfreq()
print(df_upsampled)

我得到了这个输出结果。

日期 体温
1900-01-01 00:00:00 36.23
1900-01-01 00:00:01 NaN
1900-01-01 00:00:02 NaN
1900-01-01 00:00:03 NaN
1900-01-01 00:00:04 NaN
... ...
1900-01-01 23:59:26 NaN
1900-01-01 23:59:27 NaN
1900-01-01 23:59:28 NaN
1900-01-01 23:59:29 NaN
1900-01-01 23:59:30 36.23

我还尝试了另一段代码,但得到了相同的输出结果。

import pandas as pd

#path to the excel file
df = pd.read_excel(R"C:\Users\XXX.xlsx", sheet_name="XXX", usecols=[0, 1], index_col=[0], skiprows=[0, 1])

df.index = pd.to_datetime(df.index, format='%H:%M:%S')

start_time = pd.to_datetime("22:48:00", format='%H:%M:%S')

df_upsampled = df.resample("1s", origin=start_time).asfreq()
print(df_upsampled)

你能给我一些建议吗?

1 个回答

1

示例代码

我们需要一个简单且可重复的例子来回答你的问题。下次请务必提供这样的例子。

下面是你所拥有的数据框的简化表示:

time = ['23:59:58', '00:00:00', '00:00:02']
df = pd.DataFrame([10, 20, 30], index=time, columns=['val1'])

df

            val1
23:59:58    10
00:00:00    20
00:00:02    30

问题

你遇到的问题如下:

# To preserve the original dataframe, we practice on a copy named df1
df1 = df.copy()
df1.index = pd.to_datetime(df1.index)
out = df1.resample('1s').asfreq()

out

                    val1
2024-03-20 00:00:00 20.0
2024-03-20 00:00:01 NaN
2024-03-20 00:00:02 30.0
... ...
2024-03-20 23:59:56 NaN
2024-03-20 23:59:57 NaN
2024-03-20 23:59:58 10.0
86399 rows × 1 columns

通过检查 df1,问题的原因变得清晰了。所有只包含时间的数据都被分配了相同的日期。请检查变量(这里是 df1),如果出现问题的话。

df1:

           val1
2024-03-20 23:59:58 10 <-- same date 
2024-03-20 00:00:00 20 <-- same date
2024-03-20 00:00:02 30 <-- same date

代码

通过将起始点设置为 00:00:00 来分配不同的日期,这样应该能解决问题。

下面是如何分配不同日期的示例:

# To preserve the original dataframe, we practice on a copy named df1
df1 = df.copy()

days = df1.index.to_series().str.split(':').str[0].astype('int').diff().lt(0).cumsum()
df1.index = pd.to_datetime(df1.index) + pd.to_timedelta(days, unit='D')
out = df1.resample('1s').asfreq()

out

                    val1
2024-03-20 23:59:58 10.0
2024-03-20 23:59:59 NaN
2024-03-21 00:00:00 20.0  <-- different date
2024-03-21 00:00:01 NaN
2024-03-21 00:00:02 30.0

撰写回答