将csv读入datetime对象中的year、dayofyear和hour/min索引

将csv读入datetime对象中的year、dayofyear和hour/min索引,datetime,csv,pandas,julian-date,Datetime,Csv,Pandas,Julian Date,我正在尝试以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

我正在尝试以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小时时间和两列值)

在前面的一个问题中,我对这件事有过一些想法,但没有效果,事实证明这是一个有一些问题的问题。。。()

如上问题所述,以下“读取csv”尝试

触发类型错误:

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克服了这一问题,并认为我可以在后面设置_索引,但得到以下结果:

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

我的解析器也挂断了格式,我读到过关于零填充“一年中的某一天”值的相互矛盾的故事。我的不是零填充的,但即使如此,除了上面的错误之外,我已经在第一个值上挂起了格式,这一年!以下是解析器:

def parser(x):
    return pd.datetime.strptime(x, '%Y %j %H%M')
所以是的,我有错误说“2014”未被识别,“92”(一年中的某一天)未被识别,但我受到了鼓励,因为至少strtime能够“通过”尝试这种格式

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

我正在寻找一种方法,以获得这个日期时间信息作为一个日期时间索引,我没有什么,但问题。我已经开始填充一些Julian,以防有人想测试填充格式的问题,请参见以下内容:

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

感谢你们的帮助,我开始感到沮丧了:在把你们的
%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\u csv

中非常混乱,我认为以下方法似乎有效。请记住,这是我第一次将任何东西带到pandas中使用,因此不确定如何正确测试它,但它可以识别格式并说:

<class 'pandas.tseries.index.DatetimeIndex'>
[2014-04-02 19:31:00, ..., 2014-12-21 23:59:00]
Length: 337917, Freq: None, Timezone: None
现在,我尝试在.join之前的“”之间放置一个空格,它将%Y%j分隔开,但只将“1”视为%H的一部分。因此,我去掉了空格,并将格式更改为无空格


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

哦,对了,每月排版,谢谢;事实上,我在发帖后看到了。不管怎样,我很感激你在这方面的工作。。。我应该提到我正在运行的版本:In[80]:pd.\uuuu version\uuuuuu Out[80]:“0.15.2”我已经编辑过,包含了一种非常暴力的方式。如果您的数据存在导致问题的错误,则
times
行可能会失败。如果是这样的话,那么你只需要找到麻烦的值。嘿,那太好了,你真的很了解你的东西。我对bash比对python更熟悉。你认为如果我在将日期转换成熊猫之前转换日期,事情会变得更容易吗?也许是%j弄乱了它,因为它实际上不是朱利安日,而是一年中的某一天。我有一个想法:你认为我应该自己手动创建日期范围,然后将值附加到范围中吗?如果是这样,我想我将不得不担心DST和其他转换
<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)