将MMSI位数不满足9位的数据删除
时间: 2024-02-13 16:00:21 浏览: 66
以下是使用Python语言将MMSI位数不满足9位的数据删除的示例代码:
```python
import pandas as pd
# 读取AIS数据集
ais_data = pd.read_csv('ais_data.csv')
# 删除MMSI位数不足9位的数据
ais_data = ais_data[ais_data['mmsi'].apply(lambda x: len(str(x))>=9)]
# 保存处理后的数据集
ais_data.to_csv('ais_data_processed.csv', index=False)
```
这段代码首先使用Pandas的apply函数,对每个MMSI进行长度判断,然后保留位数不少于9位的数据记录。请注意,这只是一个简单的示例代码,您可能需要根据实际情况进行修改和调整。此外,还需要根据数据集的具体格式和字段名称进行相应的修改。
相关问题
将AIS数据集中相同MMSI下相同经纬度的数据删除代码
以下是 Python 语言的代码实现,可以实现将 AIS 数据集中相同 MMSI 下相同经纬度的数据删除:
```python
import pandas as pd
# 读取 AIS 数据集
df = pd.read_csv('ais_data.csv')
# 针对每个 MMSI,将其按照时间顺序排序
df.sort_values(['MMSI', 'Time'], inplace=True)
# 遍历每个 MMSI 的数据,对于相邻两条数据,如果它们的经纬度相同,则删除后一条数据
for mmsi in df['MMSI'].unique():
# 获取当前 MMSI 的数据
mmsi_df = df[df['MMSI'] == mmsi]
# 遍历该 MMSI 的数据,删除相邻经纬度相同的数据
for i in range(1, len(mmsi_df)):
if mmsi_df.iloc[i]['Longitude'] == mmsi_df.iloc[i-1]['Longitude'] and mmsi_df.iloc[i]['Latitude'] == mmsi_df.iloc[i-1]['Latitude']:
mmsi_df.drop(mmsi_df.index[i], inplace=True)
# 更新原始数据集中该 MMSI 的数据
df[df['MMSI'] == mmsi] = mmsi_df
# 将处理后的数据保存为新的 CSV 文件
df.to_csv('ais_data_processed.csv', index=False)
```
以上代码中,`ais_data.csv` 是原始的 AIS 数据集文件,`ais_data_processed.csv` 是处理后的数据集文件。在代码实现中,首先通过 Pandas 库读取 AIS 数据集,然后针对每个 MMSI 将其按照时间顺序排序。接着遍历每个 MMSI 的数据,对于相邻两条数据,如果它们的经纬度相同,则删除后一条数据。最后将处理后的数据保存为新的 CSV 文件。
优化代码 foreach (var item in dataList) { IB_COMPANY_SHIP_DATA_STRUCT shipData = item.CompanyShipData; IB_COMPANY_SHIP_NAVI_INFO_STRUCT ship_navi_info = item.CompanyShipNaviInfo; if (shipData != null && ship_navi_info != null) { uint ship_mmsi = shipData.MMSI; int nav_id = ship_navi_info.NavID; //船不存在时 if (m_ShipInfoList.ContainsKey((int)ship_mmsi) == false) { Debug.Log($"CheckShipInfo {ship_mmsi}船不存在"); flag = true; break; } else { //判断当前字典中的Nav_ID与消息中的Nav_ID不相等 if (m_ShipInfoList[(int)ship_mmsi].Nav_ID != (uint)nav_id) { Debug.Log($"CheckShipInfo {ship_mmsi}船数据不是最新数据"); flag = true; break; } } } }
这段代码可以进行一些优化。首先,可以使用 `var` 关键字代替 `IB_COMPANY_SHIP_DATA_STRUCT` 和 `IB_COMPANY_SHIP_NAVI_INFO_STRUCT`,因为已经在前面声明了它们的类型。其次,可以将 `m_ShipInfoList.ContainsKey((int)ship_mmsi)` 的结果存储到一个变量中,以减少重复计算。最后,使用 `foreach` 循环时,如果发现不符合条件的数据可以直接使用 `return` 跳出循环,而不需要使用 `flag` 标志。
下面是优化后的代码:
```
foreach (var item in dataList)
{
var shipData = item.CompanyShipData;
var ship_navi_info = item.CompanyShipNaviInfo;
if (shipData == null || ship_navi_info == null)
continue;
uint ship_mmsi = shipData.MMSI;
int nav_id = ship_navi_info.NavID;
if (!m_ShipInfoList.TryGetValue((int)ship_mmsi, out var shipInfo))
{
Debug.Log($"CheckShipInfo {ship_mmsi}船不存在");
return true;
}
if (shipInfo.Nav_ID != (uint)nav_id)
{
Debug.Log($"CheckShipInfo {ship_mmsi}船数据不是最新数据");
return true;
}
}
```
阅读全文