【问题标题】:DateTime Parse from multiple csv filesDateTime 从多个 csv 文件中解析
【发布时间】:2021-05-08 12:37:40
【问题描述】:

傻傻地找了自己,却找不到答案。

基本上我想导入一些 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

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

【问题讨论】:

  • csv1,2 链接不起作用 :( 请将文件内容的小 sn-p 粘贴到问题本身中。
  • 请注意,不太确定要使用哪个文件共享器

标签: python bulk datetimeindex csv-import


【解决方案1】:

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

这会为所有 csv 文件按列导出一个时间戳。 我已经使用 RJ 的解决方案来照亮代码,如此优雅的导入!

【讨论】:

    【解决方案2】:

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

    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)
    

    输出:

    | DateTime                  |   ID |   trksegID |      lat |     lon |    ele | filename   |
    |:--------------------------|-----:|-----------:|---------:|--------:|-------:|:-----------|
    | 2021-01-22 01:54:03+00:00 |    1 |          1 | -32.4623 | 116.062 | 311.6  | 2.csv      |
    | 2021-01-22 01:54:04+00:00 |    2 |          1 | -32.4623 | 116.062 | 311.6  | 2.csv      |
    | 2021-01-22 01:54:05+00:00 |    3 |          1 | -32.4623 | 116.062 | 314.97 | 2.csv      |
    | 2021-01-22 01:54:06+00:00 |    4 |          1 | -32.4623 | 116.062 | 316.41 | 2.csv      |
    | 2021-01-22 01:54:07+00:00 |    5 |          1 | -32.4623 | 116.062 | 317.85 | 2.csv      |
    | 2021-01-22 01:54:08+00:00 |    6 |          1 | -32.4623 | 116.062 | 317.85 | 2.csv      |
    | 2021-01-22 01:54:09+00:00 |    7 |          1 | -32.4622 | 116.062 | 316.41 | 1.csv      |
    | 2021-01-22 01:54:10+00:00 |    8 |          1 | -32.4622 | 116.062 | 314.97 | 1.csv      |
    | 2021-01-22 01:54:11+00:00 |    9 |          1 | -32.4622 | 116.062 | 314.49 | 1.csv      |
    | 2021-01-22 01:54:12+00:00 |   10 |          1 | -32.4623 | 116.062 | 314.49 | 1.csv      |
    

    【讨论】:

    • 感谢 RJ,这可行,但与我想象的方式略有不同。我认为附加/新 csv 会将它们的结果附加到相同的时间戳(因此我的列选择和重命名以保持 df 小)。所以如果我打电话给df['2021-01-22 02:54:04'],我会得到一条包含我所有数据的线路。类似于 sergilehkyi.com/tips-on-working-with-datetime-index-in-pandas 。你知道有没有办法解决这个问题?
    • 关于“用 trkpt 跳过第一行”.... csvs 有很大(不均匀)的标题,因此有搜索功能。
    • 我看到你能够让你的代码工作,太棒了!在我的解决方案中,您可以通过特定的 DateTime filter df 来检索具有该时间戳的所有行。或者您可以在 DateTime 上执行 groupby。有多种方法可以在保持数据结构完整的同时对其进行处理。
    • 确实!它是关联来自不同数据源的 csv 的绝妙方法。我有点惊讶我找不到/谷歌解决方案,因为我在我的职业生涯中使用了这个设置。我一定是在谷歌上搜索错了。
    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 2019-11-15
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多