【问题标题】:Replace missing rows of csv data替换缺失的 csv 数据行
【发布时间】:2023-02-22 06:03:48
【问题描述】:

我有一个 80,000 行的 csv 文件,由四列 ID、日期、时间和流程组成。如果流量数据曾经丢失,则跳过丢失的数据,直到记录新的流量数据,然后数据继续记录。每 15 分钟进行一次流量测量。

例子:

USGS    2/12/2023   0:45    167
USGS    2/12/2023   1:00    170
USGS    2/12/2023   1:15    177
USGS    2/12/2023   1:45    170
USGS    2/12/2023   2:00    164
USGS    2/12/2023   2:15    177
USGS    2/12/2023   2:30    170
USGS    2/12/2023   2:45    180

此处 2023 年 2 月 12 日的记录数据中缺少 1:30。这些丢失的数据可能是一次性的,也可能会持续数小时或数天。

我正在尝试编写一个 python 脚本来搜索缺失的时间步长,每当它找到一个跳过/缺失的行时,它就会在缺失的位置添加一个替换行,并使用正确的 ID、日期、时间和 NA 进行流。

例子

USGS    2/12/2023   0:45    167
USGS    2/12/2023   1:00    170
USGS    2/12/2023   1:15    177
USGS    2/12/2023       1:30    NA
USGS    2/12/2023   1:45    170
USGS    2/12/2023   2:00    164
USGS    2/12/2023   2:15    177
USGS    2/12/2023   2:30    170
USGS    2/12/2023   2:45    180

或者

USGS    1/16/2023   23:00   329
USGS    1/16/2023   23:15   329
USGS    1/16/2023   23:30   329
USGS    1/16/2023   23:45   NA
USGS    1/17/2023   0:00    NA
USGS    1/17/2023   0:15    NA
USGS    1/17/2023   0:30    329
USGS    1/17/2023   0:45    329
USGS    1/17/2023   1:00    329
USGS    1/17/2023   1:15    329
USGS    1/17/2023   1:30    329

目前,我能够找到我们替换数据集中单个值的解决方案,例如 1:30 的时间值或没有描述替换整行缺失数据的流值。

【问题讨论】:

  • 创建一个使用时间作为键的字典。然后就可以循环遍历该时间范围内的所有15分钟时间戳。如果缺少该密钥,请使用默认数据添加它。

标签: python csv data-cleaning


【解决方案1】:

你可以用 pandas 做到这一点,它应该非常快。

import pandas as pd
df = pd.DataFrame({'ID': ['USGS', 'USGS', 'USGS', 'USGS', 'USGS', 'USGS', 'USGS', 'USGS'],
 'Date': ['2/12/2023',
  '2/12/2023',
  '2/12/2023',
  '2/12/2023',
  '2/12/2023',
  '2/12/2023',
  '2/12/2023',
  '2/12/2023'],
 'Time': ['0:45', '1:00', '1:15', '1:45', '2:00', '2:15', '2:30', '2:45'],
 'Flow': [167, 170, 177, 170, 164, 177, 170, 180]})


df['dt'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

df = df.set_index('dt').groupby('ID')['Flow'].resample('15T').mean().reset_index()

# Replace # with - if on linux system
df['Date'] = df['dt'].dt.strftime('%#m/%d/%Y')
df['Time'] = df['dt'].dt.strftime('%#H:%M')

df = df.drop(columns=['dt'])[['ID','Date','Time','Flow']]

print(df)

输出

     ID       Date  Time   Flow
0  USGS  2/12/2023  0:45  167.0
1  USGS  2/12/2023  1:00  170.0
2  USGS  2/12/2023  1:15  177.0
3  USGS  2/12/2023  1:30    NaN
4  USGS  2/12/2023  1:45  170.0
5  USGS  2/12/2023  2:00  164.0
6  USGS  2/12/2023  2:15  177.0
7  USGS  2/12/2023  2:30  170.0
8  USGS  2/12/2023  2:45  180.0

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 2018-04-26
    • 2018-02-17
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2017-04-03
    • 2016-04-09
    • 2022-06-27
    相关资源
    最近更新 更多