在 pandas 数据框中添加缺失时间
Adding missing time in pandas dataframe
我有一个 pandas.DataFrame
列中包含时间戳。这些值以纪元为单位,相隔 0.1 秒。 1488771900.100000, 1488771900.200000
等值。但是,存在缺失值。所以我有 1488794389.500000
,然后是 1488794389.900000
,中间有 3 个缺失值。我想在数据框中插入行,在此列的最大值和最小值之间缺少值。因此,如果最小值是 1488771900.000000
,最大值是 1488794660.000000
,我想插入所有值以 0.1 秒分隔的行,并且在所有其他列中插入 NA。
我在这个 link 中看到了一个答案,但无法复制相同的答案。
如何执行此操作?
您可以使用 pandas.DataFrame.resample
填写您缺少的时间。需要注意的是数据框需要有一个 pandas.DateTimeIndex
。在您的情况下,时间可能存储为自纪元以来以秒为单位的浮点数,这需要在重新采样之前进行转换。这是一个将执行该操作的函数。
代码:
import datetime as dt
import pandas as pd
def resample(dataframe, time_column, sample_period):
# make a copy of the dataframe
dataframe = dataframe.copy()
# convert epoch times to datetime
dataframe.time = dataframe.time.apply(
lambda ts: dt.datetime.fromtimestamp(ts))
# make the datetimes into an index
dataframe.set_index(time_column, inplace=True)
# resample to desired period
dataframe = dataframe.resample(sample_period).asfreq().reset_index()
# convert datetimes back to epoch
epoch = dt.datetime.fromtimestamp(0)
dataframe.time = dataframe.time.apply(
lambda ts: (ts - epoch).total_seconds())
return dataframe
测试代码:
values = [
(1488771900.10, 'a'),
(1488771900.20, 'b'),
(1488771900.30, 'c'),
(1488771900.60, 'f'),
]
columns = ['time', 'value']
df = pd.DataFrame(values, columns=columns)
print(df)
new_df = resample(df, 'time', '100ms')
print(new_df)
结果:
time value
0 1.488772e+09 a
1 1.488772e+09 b
2 1.488772e+09 c
3 1.488772e+09 f
time value
0 1.488772e+09 a
1 1.488772e+09 b
2 1.488772e+09 c
3 1.488772e+09 NaN
4 1.488772e+09 NaN
5 1.488772e+09 f
我有一个 pandas.DataFrame
列中包含时间戳。这些值以纪元为单位,相隔 0.1 秒。 1488771900.100000, 1488771900.200000
等值。但是,存在缺失值。所以我有 1488794389.500000
,然后是 1488794389.900000
,中间有 3 个缺失值。我想在数据框中插入行,在此列的最大值和最小值之间缺少值。因此,如果最小值是 1488771900.000000
,最大值是 1488794660.000000
,我想插入所有值以 0.1 秒分隔的行,并且在所有其他列中插入 NA。
我在这个 link 中看到了一个答案,但无法复制相同的答案。
如何执行此操作?
您可以使用 pandas.DataFrame.resample
填写您缺少的时间。需要注意的是数据框需要有一个 pandas.DateTimeIndex
。在您的情况下,时间可能存储为自纪元以来以秒为单位的浮点数,这需要在重新采样之前进行转换。这是一个将执行该操作的函数。
代码:
import datetime as dt
import pandas as pd
def resample(dataframe, time_column, sample_period):
# make a copy of the dataframe
dataframe = dataframe.copy()
# convert epoch times to datetime
dataframe.time = dataframe.time.apply(
lambda ts: dt.datetime.fromtimestamp(ts))
# make the datetimes into an index
dataframe.set_index(time_column, inplace=True)
# resample to desired period
dataframe = dataframe.resample(sample_period).asfreq().reset_index()
# convert datetimes back to epoch
epoch = dt.datetime.fromtimestamp(0)
dataframe.time = dataframe.time.apply(
lambda ts: (ts - epoch).total_seconds())
return dataframe
测试代码:
values = [
(1488771900.10, 'a'),
(1488771900.20, 'b'),
(1488771900.30, 'c'),
(1488771900.60, 'f'),
]
columns = ['time', 'value']
df = pd.DataFrame(values, columns=columns)
print(df)
new_df = resample(df, 'time', '100ms')
print(new_df)
结果:
time value
0 1.488772e+09 a
1 1.488772e+09 b
2 1.488772e+09 c
3 1.488772e+09 f
time value
0 1.488772e+09 a
1 1.488772e+09 b
2 1.488772e+09 c
3 1.488772e+09 NaN
4 1.488772e+09 NaN
5 1.488772e+09 f