使用read_csv导入时的python pandas date_range

时间:2013-06-07 15:35:41

标签: python pandas

我有一个.csv文件,其中包含以下格式的一些数据:

1.69511909,  0.57561167,  0.31437427,  0.35458831,  0.15841189, 0.28239582, -0.18180907,  1.34761404, -1.5059083,  1.29246638
-1.66764664,  0.1488095,  1.03832221, -0.35229205,  1.35705861, -1.56747104, -0.36783851, -0.57636948,  0.9854391,  1.63031066
0.87763775,  0.60757153,  0.64908314, -0.68357724,  0.33499838, -0.08557089,  1.71855596, -0.61235066, -0.32520105,  1.54162629

每一行对应一个特定日期,一行中的每条记录都对应当天的特定小时。

是否有一种方便的方法可以使用read_csv导入数据,以便所有内容都可以正确编入索引,即导入功能可以区分不同的日期(行),以及几天内的小时数(行中的单独记录)。

2 个答案:

答案 0 :(得分:2)

像这样的东西。请注意,由于某种原因,我无法复制您的字符串,因此我的数据集已被截止....

读入字符串(它读作数据帧,因为我的中有新行)....但需要强制转换为系列。

In [23]: s = pd.read_csv(StringIO(data)).values

In [24]: s
Out[24]: 
array([[-1.66764664,  0.1488095 ,  1.03832221, -0.35229205,  1.35705861,
        -1.56747104, -0.36783851, -0.57636948,  0.9854391 ,  1.63031066],
       [ 0.87763775,  0.60757153,  0.64908314, -0.68357724,  0.33499838,
        -0.08557089,  1.71855596,         nan,         nan,         nan]])

In [25]: s = Series(pd.read_csv(StringIO(data)).values.ravel())

In [26]: s
Out[26]: 
0    -1.667647
1     0.148810
2     1.038322
3    -0.352292
4     1.357059
5    -1.567471
6    -0.367839
7    -0.576369
8     0.985439
9     1.630311
10    0.877638
11    0.607572
12    0.649083
13   -0.683577
14    0.334998
15   -0.085571
16    1.718556
17         NaN
18         NaN
19         NaN
dtype: float64

只需直接设置索引....请注意,您自行负责对齐,这非常有用 容易被1个人说出来

In [27]: s.index = pd.date_range('20130101',freq='H',periods=len(s))

In [28]: s
Out[28]: 
2013-01-01 00:00:00   -1.667647
2013-01-01 01:00:00    0.148810
2013-01-01 02:00:00    1.038322
2013-01-01 03:00:00   -0.352292
2013-01-01 04:00:00    1.357059
2013-01-01 05:00:00   -1.567471
2013-01-01 06:00:00   -0.367839
2013-01-01 07:00:00   -0.576369
2013-01-01 08:00:00    0.985439
2013-01-01 09:00:00    1.630311
2013-01-01 10:00:00    0.877638
2013-01-01 11:00:00    0.607572
2013-01-01 12:00:00    0.649083
2013-01-01 13:00:00   -0.683577
2013-01-01 14:00:00    0.334998
2013-01-01 15:00:00   -0.085571
2013-01-01 16:00:00    1.718556
2013-01-01 17:00:00         NaN
2013-01-01 18:00:00         NaN
2013-01-01 19:00:00         NaN
Freq: H, dtype: float64

答案 1 :(得分:1)

首先阅读DataFrame:

df = pd.read_csv(file_name, sep=',\s+', header=None)

然后将索引设置为日期,将列设置为小时*

df.index = pd.date_range('2012-01-01', freq='D', periods=len(df))
from pandas.tseries.offsets import Hour
df.columns = [Hour(7+t) for t in df.columns]

In [5]: df
Out[5]:
            <7 Hours>  <8 Hours>  <9 Hours>  <10 Hours>  <11 Hours>   <12 Hours>  <13 Hours>  <14 Hours>  <15 Hours>  <16 Hours>
2012-01-01   1.695119   0.575612   0.314374    0.354588    0.158412   0.282396   -0.181809    1.347614   -1.505908    1.292466
2012-01-02  -1.667647   0.148810   1.038322   -0.352292    1.357059  -1.567471   -0.367839   -0.576369    0.985439    1.630311
2012-01-03   0.877638   0.607572   0.649083   -0.683577    0.334998  -0.085571    1.718556   -0.612351   -0.325201    1.541626

然后堆叠它并添加MultiIndex的日期和小时级别:

s = df.stack()
s.index = [x[0]+x[1] for x in s.index]

In [8]: s
Out[8]:
2012-01-01 07:00:00    1.695119
2012-01-01 08:00:00    0.575612
2012-01-01 09:00:00    0.314374
2012-01-01 10:00:00    0.354588
2012-01-01 11:00:00    0.158412
2012-01-01 12:00:00    0.282396
2012-01-01 13:00:00   -0.181809
2012-01-01 14:00:00    1.347614
2012-01-01 15:00:00   -1.505908
2012-01-01 16:00:00    1.292466
2012-01-02 07:00:00   -1.667647
2012-01-02 08:00:00    0.148810
...

* 您可以使用不同的偏移量see here,例如MinuteSecond