关于从Excel表中重采样数据框时的时间延迟问题
我有一个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