我试图以这种形式阅读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小时,以及两列值)。
我在前一个问题中对此问题有过一些想法,但无济于事,事实证明这是一个问题......(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:
TypeError: parser() takes exactly 1 argument (3 given)
这是由于" parse_dates" arg有0,1,2。 我也尝试将它们放在双括号[[0,1,2]]中并得到:
ValueError: [0, 1, 2] is not in list
我已经通过设置parse_dates = True来解决这个问题,并认为我可以在之后使用set_index但是得到这个:
TypeError:必须是字符串,而不是numpy.int64
我的解析器也被格式化了,而且我已经阅读了关于零填充的相互矛盾的故事"一年中的#34;值。我不是零填充,但即便如此,除了错误之外,我已经将格式挂在第一个值,即年份!这是解析器:
def parser(x):
return pd.datetime.strptime(x, '%Y %j %H%M')
所以,我有错误说' 2014'不承认,并且' 92' (一年中的某一天)没有被承认,但是受到了鼓励,因为至少strptime已经能够通过"通过"试试这种格式。
我想知道这是否与我的数据有关。
我正在寻找一种方法来将这个日期时间信息编入索引作为日期时间,除了问题我什么都没有。我已经继续并填补了一些julians,以防有人想测试格式是填充问题,见下文:
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
答案 0 :(得分: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
内非常混乱。
答案 1 :(得分:1)
我认为以下似乎有效。请记住,这是我第一次携带任何东西进入大熊猫工作,所以不确定如何正确测试它,但它识别格式并说:
<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)
现在我试图在&#39;&#39;之间留一个空格。在.join之前它将%Y%j分开,但只能看到&#34; 1&#34;作为%H的一部分。所以我摆脱了空间,并将格式改为无空间。
感谢您在此DSM上的工作。