【问题标题】:Adding missing time in pandas dataframe在熊猫数据框中添加缺失时间
【发布时间】:2017-07-29 02:57:14
【问题描述】:

我有一个pandas.DataFrame,列中有时间戳。这些值以纪元为单位,相隔 0.1 秒。 1488771900.100000, 1488771900.200000 等值。但是,存在缺失值。所以我有1488794389.500000 然后1488794389.900000 之间有3 个缺失值。我想在数据框中插入在该列的最大值和最小值之间缺失值的行。因此,如果最小值为1488771900.000000 且最大值为1488794660.000000,我想在所有其他列中插入所有值以 0.1 秒和 NA 分隔的行。

我在link 中看到了答案,但无法复制相同的答案。

如何执行此操作?

【问题讨论】:

  • 链接的帖子应该有效,请发布原始数据、创建 df 的代码、您的尝试和任何错误

标签: python pandas datetime epoch


【解决方案1】:

您可以使用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

【讨论】:

  • 这是一个很好的答案,但 .apply() 在较大的数据帧上可能会很慢。相反,也许看看df['time'] = pd.to_datetime(df['time'],unit='s')(更多here
猜你喜欢
  • 2018-03-15
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2018-10-06
相关资源
最近更新 更多