从多个 csv 文件中解析日期时间

问题描述

愚蠢地搜索自己,但找不到答案。

基本上我想导入一些 GPS 文件,目的是在任何给定时间知道每个 GPS 的位置。

我想为此使用 Panda 的日期时间索引。我似乎无法弄清楚如何对齐这些数据。

我的结果是每个 gps 都会启动一个新的时间日期索引,我想每次导入都会覆盖我的时间数据。

我曾尝试先在 for 循环外创建 df,但效果不佳。

csv1

csv2

这是我的代码

import pandas as pd
import glob
import os
from datetime import datetime
from pandas import ExcelWriter

pattern = '*.csv'
csv_files = glob.glob(pattern)
frames = []


for csv in csv_files:
    with open(csv) as fp:
        skip = next(filter(
            lambda x: x[1].startswith('trkpt'),enumerate(fp)
        ))[0] + 1
    df = pd.read_csv(csv,usecols = ['lat','lon','ele','time'],parse_dates=['time'],skiprows=skip)
    df['DateTime'] = pd.to_datetime(df['time'],format='%Y-%m-%d %H:%M:%s')
    df = df.set_index('DateTime')
    df.rename(columns={'lat':'lat' + ' ' + csv,'lon':'lon' + ' ' + csv,'ele':'ele' + ' ' + csv},inplace=True)
    df.drop(['time'],axis=1,inplace=True)
    frames.append(df)

df = pd.concat(frames)

df.to_csv('GPS Export.csv',sep=',')

文件示例

trkpt                   

ID  trksegID    lat lon ele time
1   1   -32.46226206    116.0619373 311.6   2021-01-22T01:54:03Z
2   1   -32.46225444    116.0619245 311.6   2021-01-22T01:54:04Z
3   1   -32.46225762    116.0619227 314.97  2021-01-22T01:54:05Z
4   1   -32.46226215    116.0619119 316.41  2021-01-22T01:54:06Z
5   1   -32.46226123    116.0618896 317.85  2021-01-22T01:54:07Z
6   1   -32.46225611    116.0618791 317.85  2021-01-22T01:54:08Z
7   1   -32.46224949    116.0618693 316.41  2021-01-22T01:54:09Z
8   1   -32.46224086    116.0618602 314.97  2021-01-22T01:54:10Z
9   1   -32.46223943    116.0618525 314.49  2021-01-22T01:54:11Z
10  1   -32.46225385    116.0618722 314.49  2021-01-22T01:54:12Z

日期格式也有一个小问题,但我可以忍受

解决方法

解决方案是在连接文件后设置日期时间索引。下面的代码片段假定所有 csv 的格式都与您的 csv 代码片段类似,并跳过带有 y 的第一行。它还添加了一个带有 csv 文件名的列,因为您似乎希望对文件名进行一些重命名或后处理。

trkpt

输出:

import glob
import pandas as pd
import os

df = pd.concat([pd.read_csv(fp,skiprows=1).assign(filename=os.path.basename(fp)) for fp in glob.glob('*.csv')])
df['DateTime'] = pd.to_datetime(df['time'],format='%Y-%m-%d %H:%M:%S')
df = df.set_index('DateTime')
df.drop(['time'],axis=1,inplace=True)
,

感觉有点傻,解决办法是把concat改成: df = pd.concat(frames,axis=1)

这将为与列一致的所有 csv 文件导出一个时间戳。 我已经用RJ的解决方案把代码擦亮了,好优雅的导入!