【问题标题】:Importing CSV files into Postgres with datetime field that contains milliseconds?使用包含毫秒的日期时间字段将 CSV 文件导入 Postgres?
【发布时间】:2017-05-28 12:41:49
【问题描述】:

我需要将 CSV 文件导入 Postgres(版本 9.6.3),我需要帮助来了解执行此操作的最佳方法。

CSV 的格式如下所示,除了了解实际导入文件的最佳方式外,我还不确定应该在表中使用哪种数据类型来存储“时间”字段,因为它包含毫秒,格式为 'YYYY.MM.DD HH:MM:SS.MS'

Time,Col1,Col2,Col3,Col4
2017.05.01 00:00:02.851,1.09062,1.09057,4.35,5.42
2017.05.01 00:00:03.368,1.09062,1.09058,3.22,1
...

我有 pgadmin 客户端,因此可以使用它,但我也愿意从命令行使用原始 SQL 或使用 Python (Python 3.6) 创建表并导入数据。

我要导入的文件大小从 20 mb 到数百 mb 不等,因此我想找到最快的方法。

非常感谢任何帮助或指点。

谢谢!

【问题讨论】:

    标签: python sql postgresql csv import


    【解决方案1】:

    您的表格可能如下所示(为列选择 numeric types 之一):

    create table my_table(
        time timestamp, 
        col1 numeric, 
        col2 numeric, 
        col3 numeric, 
        col4 numeric);
    

    使用copy command,例如:

    copy my_table from '/data/my_file.csv' (format csv, header);
    
    select * from my_table;
    
              time           |  col1   |  col2   | col3 | col4 
    -------------------------+---------+---------+------+------
     2017-05-01 00:00:02.851 | 1.09062 | 1.09057 | 4.35 | 5.42
     2017-05-01 00:00:03.368 | 1.09062 | 1.09058 | 3.22 |    1
    (2 rows)
    

    如果文件非常大,您可以将其导入到未记录的表中,然后在更改表后记录(请参阅alter table)。这可以减少导入的时间。

    alter table my_table set unlogged;
    copy my_table from '/data/my_file.csv' (format csv, header);
    alter table my_table set logged;
    

    拥有 Postgres 的操作系统用户必须对该文件具有读取权限。

    【讨论】:

    • 谢谢克林,如果一切顺利,我会尽快测试并标记为“正确答案”。我不确定 CVS 文件中时间字段的格式是否会导入,因为在您的示例中显示 YYYY MM 等使用破折号“-”分隔,但在我的 CSV 中它使用句号/句点“。” - 我希望这不会导致任何问题,并将在导入过程中进行转换...感谢您的帮助,非常感谢...
    • 你是绝对的明星,谢谢!
    • 感谢 Klin,我刚刚使用您在上面提供的信息完成了导入 - 我已将此标记为正确答案。谢谢
    猜你喜欢
    • 2020-08-27
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2016-10-31
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多