【问题标题】:Create an indexed datetime from date/time info in 3 columns using pandas使用 pandas 从 3 列中的日期/时间信息创建索引日期时间
【发布时间】:2015-02-21 14:15:06
【问题描述】:

首先,这是我的数据示例,一个包含年份、儒略日、2400 小时和 2 个值列的 csv。

2014,92,1931,6.234,10.14
2014,92,1932,5.823,9.49
2014,92,1933,5.33,7.65
2014,92,1934,4.751,6.19
2014,92,1935,4.156,5.285
2014,92,1936,3.962,4.652
2014,92,1937,3.74,4.314
2014,92,1938,3.325,3.98
2014,92,1939,2.909,3.847
2014,92,1940,2.878,3.164

所以,我从加载库开始

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    from datetime import datetime

然后我运行解析器(如果我错了请纠正我,这是我格式化以匹配我的数据的位?)

def parser(x):
    return pd.datetime.strptime(x, '%Y %j %H%M')

然后我去创建变量“data”,它是一个读入的并且希望是日期时间索引的 pandas 数据帧...

data = pd.read_csv('sorted.dat',parse_dates=[0,1,2], date_parser=parser,index_col=0, header=None )

生成的数据框如下所示:

dt  3   4
0   2014 92 1931    6.234   10.140
1   2014 92 1932    5.823   9.490
2   2014 92 1933    5.330   7.650
3   2014 92 1934    4.751   6.190
4   2014 92 1935    4.156   5.285
5   2014 92 1936    3.962   4.652
6   2014 92 1937    3.740   4.314
7   2014 92 1938    3.325   3.980
8   2014 92 1939    2.909   3.847
9   2014 92 1940    2.878   3.164
10  2014 92 1941    2.303   3.020
11  2014 92 1942    2.078   2.700
12  2014 92 1943    2.078   2.161
13  2014 92 1944    1.784   2.157
14  2014 92 1945    1.319   1.902
15  2014 92 1949    1.077   1.294
16  2014 92 1950    0.838   1.262
17  2014 92 1951    0.703   0.949
18  2014 92 1952    0.436   0.834
19  2014 92 1953    0.416   0.564
20  2014 92 1954    0.416   0.431
21  2014 92 1955    0.416   0.431
22  2014 92 1956    0.416   0.431
23  2014 92 1957    0.416   0.431
24  2014 92 1958    0.416   0.431
25  2014 92 1959    0.416   0.431
26  2014 92 2000    0.416   0.431
27  2014 92 2001    0.416   0.431
28  2014 92 2002    0.405   0.431
29  2014 92 2003    0.360   0.421
... ... ... ...
337887  2014 355 2330   0.000   0.000
337888  2014 355 2331   0.000   0.000
337889  2014 355 2332   0.000   0.000
337890  2014 355 2333   0.000   0.000
337891  2014 355 2334   0.000   0.000
337892  2014 355 2335   0.000   0.000
337893  2014 355 2336   0.000   0.000
337894  2014 355 2337   0.000   0.000
337895  2014 355 2338   0.000   0.000
337896  2014 355 2339   0.000   0.000
337897  2014 355 2340   0.000   0.000
337898  2014 355 2341   0.000   0.000
337899  2014 355 2342   0.000   0.000
337900  2014 355 2343   0.000   0.000
337901  2014 355 2344   0.000   0.000
337902  2014 355 2345   0.000   0.000
337903  2014 355 2346   0.000   0.000
337904  2014 355 2347   0.000   0.000
337905  2014 355 2348   0.000   0.000
337906  2014 355 2349   0.000   0.000
337907  2014 355 2350   0.000   0.000
337908  2014 355 2351   0.000   0.000
337909  2014 355 2352   0.000   0.000
337910  2014 355 2353   0.000   0.000
337911  2014 355 2354   0.000   0.000
337912  2014 355 2355   0.000   0.000
337913  2014 355 2356   0.000   0.000
337914  2014 355 2357   0.000   0.000
337915  2014 355 2358   0.000   0.000
337916  2014 355 2359   0.000   0.000

当我运行它时,我得到一个错误

  ValueError: time data 'dt' does not match format '%Y %j %H%M'

【问题讨论】:

    标签: python datetime pandas indexing


    【解决方案1】:

    尝试将解析器添加到您的 read_csv

    #assuming the order is year, month, day.  if you have time too, '%Y-%m-%d %H:%M:%S'    
    parser = lambda p: pd.datetime.strptime(p, '%Y-%m-%d')  
    
    df = pd.read_csv('sorted.dat', 
                      parse_dates={'datetime': [1,2,3]}, 
                      date_parser=parser, 
                      header=None)
    

    更新

    解析器看起来正确。我相信您当前的问题出在您的 read_csv() 中。 parse_dates arg 的格式未更正(请参阅下面的文档字符串的摘录)。

    如果 [1, 2, 3] -> 尝试将第 1、2、3 列分别解析为单独的日期列。

    如果 [[1, 3]] -> 合并第 1 列和第 3 列并解析为单个日期列。

    因此,您的解析器一次期望所有 3 列,但一次只获取 1 列。当我向解析器函数添加 print x 语句时,我发现了这一点。试试这个使用列表方法的修改

    data = pd.read_csv('sorted.dat',parse_dates=[[0,1,2]], date_parser=parser,index_col=0, header=None ) 
    

    【讨论】:

    • 我的问题更深入,我已经编辑了我的问题来说明。感谢您在解析器上的建议 - 我已经合并了它。
    • 然后它认为它是一个列表,并且不喜欢它。我尝试了很多不同的方法,但没有任何效果。我打算换个方式问这个问题,希望对这个问题有一些新的看法。快把我逼疯了!
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多