【问题标题】:Search Missing Timestamp and display in python?搜索缺少的时间戳并在 python 中显示?
【发布时间】:2016-11-04 09:23:54
【问题描述】:

这是我的一些数据集,其中包含 Time,Temperature1,Temperature2

Timestamp.             Temperature1.        Temperature2
09/01/2016 00:00:08          53.4.                       45.5
09/01/2016 00:00:38.         53.5.                       45.2
09/01/2016 00:01:08.         54.6.                        43.2
09/01/2016 00:01:38.         55.2.                        46.3
09/01/2016 00:02:08.         54.5.                        45.5
09/01/2016 00:04:08.         54.2.                       35.5
09/01/2016 00:05:08.         52.4.                        45.7
09/01/2016 00:05:38.         53.4.                         45.2

我的数据每 30 秒输入一次..

这是我的数据集..缺少一些时间戳..bcoz。每 30 秒我的数据就会到来..所以一些数据点丢失了.. 如何找到该数据点..并将数据插入为 NAN ... 请帮帮我..

【问题讨论】:

标签: python pandas


【解决方案1】:

你可以使用resample('30S', base=8)方法:

In [20]: x.resample('30S', base=8).mean()
Out[20]:
                                 Temperature1    Temperature2
Timestamp
2016-09-01 00:00:08                      53.4            45.5
2016-09-01 00:00:38                      53.5            45.2
2016-09-01 00:01:08                      54.6            43.2
2016-09-01 00:01:38                      55.2            46.3
2016-09-01 00:02:08                      54.5            45.5
2016-09-01 00:02:38                       NaN             NaN
2016-09-01 00:03:08                       NaN             NaN
2016-09-01 00:03:38                       NaN             NaN
2016-09-01 00:04:08                      54.2            35.5
2016-09-01 00:04:38                       NaN             NaN
2016-09-01 00:05:08                      52.4            45.7
2016-09-01 00:05:38                      53.4            45.2

上面的解决方案假定Timestampdatetime dtype 并且它已被设置为索引。 如果Timestamp 是常规列(不是索引),那么从 Pandas 0.19.0 开始,我们可以使用 on='column_name' 参数对常规列重新采样(它必须是 datetime dtype):

In [26]: x.resample('30S', on='Timestamp', base=8).mean()
Out[26]:
                                 Temperature1    Temperature2
Timestamp
2016-09-01 00:00:08                      53.4            45.5
2016-09-01 00:00:38                      53.5            45.2
2016-09-01 00:01:08                      54.6            43.2
2016-09-01 00:01:38                      55.2            46.3
2016-09-01 00:02:08                      54.5            45.5
2016-09-01 00:02:38                       NaN             NaN
2016-09-01 00:03:08                       NaN             NaN
2016-09-01 00:03:38                       NaN             NaN
2016-09-01 00:04:08                      54.2            35.5
2016-09-01 00:04:38                       NaN             NaN
2016-09-01 00:05:08                      52.4            45.7
2016-09-01 00:05:38                      53.4            45.2

如果你需要动态地找到你的base值,你可以这样做:

In [21]: x.index[0].second
Out[21]: 8

来自docs

base : int,默认为 0

对于均匀细分 1 天的频率,聚合间隔的“原点”。例如,对于5min 频率,基数的范围可以从04

默认为0

【讨论】:

    【解决方案2】:

    假设时间戳已转换为datetime,如果您将索引设置为时间戳列,然后将reindex 设置为日期范围,则会显示缺失值:

    In [94]:
    df['Timestamp'] = pd.to_datetime(df['Timestamp'])
    df = df.set_index('Timestamp')
    df
    
    Out[94]:
                         Temperature1  Temperature2
    Timestamp                                      
    2016-09-01 00:00:08          53.4          45.5
    2016-09-01 00:00:38          53.5          45.2
    2016-09-01 00:01:08          54.6          43.2
    2016-09-01 00:01:38          55.2          46.3
    2016-09-01 00:02:08          54.5          45.5
    2016-09-01 00:04:08          54.2          35.5
    2016-09-01 00:05:08          52.4          45.7
    2016-09-01 00:05:38          53.4          45.2
    
    In [96]:    
    df.reindex(pd.date_range(start=df.index[0], end=df.index[-1], freq='30s'))
    
    Out[96]:
                         Temperature1  Temperature2
    2016-09-01 00:00:08          53.4          45.5
    2016-09-01 00:00:38          53.5          45.2
    2016-09-01 00:01:08          54.6          43.2
    2016-09-01 00:01:38          55.2          46.3
    2016-09-01 00:02:08          54.5          45.5
    2016-09-01 00:02:38           NaN           NaN
    2016-09-01 00:03:08           NaN           NaN
    2016-09-01 00:03:38           NaN           NaN
    2016-09-01 00:04:08          54.2          35.5
    2016-09-01 00:04:38           NaN           NaN
    2016-09-01 00:05:08          52.4          45.7
    2016-09-01 00:05:38          53.4          45.2
    

    这里假设时间戳是有规律的,这里我们使用时间戳的第一个和最后一个值构造一个日期范围,频率为 30 秒:

    In [97]:
    pd.date_range(start=df.index[0], end=df.index[-1], freq='30s')
    
    Out[97]:
    DatetimeIndex(['2016-09-01 00:00:08', '2016-09-01 00:00:38',
                   '2016-09-01 00:01:08', '2016-09-01 00:01:38',
                   '2016-09-01 00:02:08', '2016-09-01 00:02:38',
                   '2016-09-01 00:03:08', '2016-09-01 00:03:38',
                   '2016-09-01 00:04:08', '2016-09-01 00:04:38',
                   '2016-09-01 00:05:08', '2016-09-01 00:05:38'],
                  dtype='datetime64[ns]', freq='30S')
    

    当您使用此reindex 时,任何缺少的索引标签都会变为NaN

    【讨论】:

    • 感谢它的真正工作......如果我们找到平均值,那么我们也可以计算缺失数据的平均值......根据以前的数据?
    • 抱歉什么意思?您想用均值填充缺失值,还是希望均值包含缺失的行值?
    • 我想计算缺失值的平均值?
    • 你的意思是df.mean(skipna=False)?
    • 这里还有一个问题,我将作为一个新问题发布..因为我的一些代码没有给我正确的输出..我正在使用 linux.and 相同的代码在 Windows 中正常运行。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2020-07-22
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多