【问题标题】:read csv into index of year, dayofyear, and hour/min into a pandas datetime object将 csv 读入年、年日和小时/分钟的索引到 pandas 日期时间对象
【发布时间】:2015-02-24 18:11:47
【问题描述】:

我正在尝试以这种形式读取 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

明确地说,这是(年、一年中的某天、2400 小时时间和 2 列值)。

我在上一个问题中对此事有过一些想法,但无济于事,事实证明这是一个问题......(Create an indexed datetime from date/time info in 3 columns using pandas

如上述问题所述,以下“read_csv”尝试

df = pd.read_csv("home_prepped.dat", parse_dates={"dt" : [0,1,2]}, 
                  date_parser=parser, header=None)

触发类型错误:

TypeError: parser() takes exactly 1 argument (3 given) 

这是由于“parse_dates”参数中包含 0,1,2。 我也尝试将它们放在双括号 [[0,1,2]] 中并得到:

ValueError: [0, 1, 2] is not in list

我已经通过设置 parse_dates=True 来解决这个问题,并认为我可以在 set_index 之后得到这个:

TypeError: 必须是字符串,而不是 numpy.int64

我的解析器也被格式所困扰,我读过关于“一年中的一天”值进行零填充的相互矛盾的故事。我的不是零填充的,但即使如此,除了错误之外,我的格式已经挂在第一个值上,年份!这是解析器:

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

所以是的,我有错误说“2014”无法识别,“92”(一年中的某天)无法识别,但受到鼓励,因为至少 strptime 能够“通过”尝试格式。

我想知道这是否与我的数据有关。

我正在寻找一种方法来将此日期时间信息索引为日期时间,但我遇到了问题。我已经继续填充了一些朱利安,以防有人想测试格式是否存在填充问题,见下文:

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

感谢你们的帮助,我开始真的很沮丧:S

【问题讨论】:

    标签: datetime csv pandas julian-date


    【解决方案1】:

    将您的%m(月)更正为%M(分钟)后,您的代码对我有效:

    >>> import pandas as pd
    >>> print pd.version.version
    0.15.2-10-gf7af818
    >>> 
    >>> def parser(x):
    ...         return pd.datetime.strptime(x, '%Y %j %H%M')
    ... 
    >>> df = pd.read_csv("home_prepped.dat", parse_dates={"dt" : [0,1,2]}, 
    ...                  date_parser=parser, header=None)
    >>> df
                       dt      3       4
    0 2014-04-02 19:31:00  6.234  10.140
    1 2014-04-02 19:32:00  5.823   9.490
    2 2014-04-02 19:33:00  5.330   7.650
    3 2014-04-02 19:34:00  4.751   6.190
    4 2014-04-02 19:35:00  4.156   5.285
    5 2014-04-02 19:36:00  3.962   4.652
    6 2014-04-02 19:37:00  3.740   4.314
    7 2014-04-02 19:38:00  3.325   3.980
    8 2014-04-02 19:39:00  2.909   3.847
    9 2014-04-02 19:40:00  2.878   3.164
    

    但是在玩了一会儿之后,发生错误时会出现一些非常奇怪的行为,导致一些奇怪的错误消息,所以我明白为什么很难调试了。


    如果由于某种原因上述方法不起作用,您可以尝试自己进行解析:

    df = pd.read_csv("home_prepped.dat", header=None)
    timestr = df.iloc[:,:3].astype(str).apply(' '.join,axis=1)
    df = df.iloc[:,3:]
    times = pd.to_datetime(timestr, format='%Y %j %H%M')
    df["dt"] = times
    

    如上所述,当出现问题(例如解析错误)时,read_csv 中的错误消息非常令人困惑。

    【讨论】:

    • 哦,对了,每月打错字,谢谢;实际上,我在发布后就看到了。无论如何,我很欣赏这方面的工作......我应该提到我正在运行 version:In [80]: pd.__version__ Out[80]: '0.15.2'
    • 我进行了编辑以包含一种非常蛮力的方法。如果您的数据有问题导致问题,那么times 行可能会失败。如果是这样,那么您只需要找到麻烦的值即可。
    • 嘿,太好了,你真的很了解你的东西。我对 bash 比对 python 更熟悉。如果我在将日期转换为 pandas 之前转换日期,你认为事情对我来说会更容易吗?
    • 也许是 %j 搞砸了它,因为它不是真正的儒略日,而是一年中的某一天。
    • 我有一个想法:你认为我应该自己手动创建 date_range 然后将值附加到范围吗?如果是这样,我想我将不得不担心 DST 和其他转变
    【解决方案2】:

    我认为以下似乎可行。请记住,这是我第一次在 pandas 中使用任何东西,所以不确定如何正确测试它,但它可以识别格式并说:

    <class 'pandas.tseries.index.DatetimeIndex'>
    [2014-04-02 19:31:00, ..., 2014-12-21 23:59:00]
    Length: 337917, Freq: None, Timezone: None
    

    这很好,因为我相信这意味着我终于索引了一个日期时间!

    这就是我所做的......

    In [41]:
    
    import numpy as np
    import pandas as pd
    from datetime import datetime
    In [60]:
    
    def parse(yr, yearday, hrmn):
              date_string = ''.join([yr, yearday, hrmn])
              return datetime.strptime(date_string,"%Y%j%H%M")
    In [61]:
    
    
    df = pd.read_csv('home_prepped.csv', parse_dates={'datetime':[0,1,2]}, date_parser=parse, index_col='datetime', header=None)
    

    现在我尝试在 .join 之前的 '' 之间放置一个空格,它将 %Y %j 分隔开,但仅设法将“1”视为 %H 的一部分。所以我摆脱了空间并将格式也更改为无空间。

    感谢您为此 DSM 所做的工作。

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 2012-08-29
      • 2012-05-25
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      相关资源
      最近更新 更多