为什么使用CSV文件将第一列作为dtype64 [ns]加载,而将txt作为对象加载

时间:2016-06-27 08:28:37

标签: python pandas

感谢这个论坛的其他人在这里我有这个代码:

names=['Date','Wind Speed','Wind Direction']
df2 = pd.read_csv('test_met.csv', index_col=0, names=names, parse_dates=[0])

aethalometer=['Date','Conc']
df1=pd.read_csv('BC_2012_1min.csv', index_col=0, names=aethalometer, parse_dates=[0])
df1=df1[df1['Conc']>-10]

print(len(df1))

print("here")

df1.index = df1.index.to_period('h')
df2['per'] = df2.index.to_period('h')
pers = df2.loc[(df2['Wind Direction'] > 340) | (df2['Wind Direction'] < 12) , 'per'].unique()

现在:我得到:

  

TypeError:unorderable类型:str()&gt; INT()

打印df1.index:

我明白了:

Index(['TimeW_1min', '01/04/2012 00:00', '01/04/2012 00:01',
       '01/04/2012 00:02', '01/04/2012 00:03', '01/04/2012 00:04',
       '01/04/2012 00:05', '01/04/2012 00:06', '01/04/2012 00:07',
       '01/04/2012 00:08',
       ...
       '30/09/2012 23:50', '30/09/2012 23:51', '30/09/2012 23:52',
       '30/09/2012 23:53', '30/09/2012 23:54', '30/09/2012 23:55',
       '30/09/2012 23:56', '30/09/2012 23:57', '30/09/2012 23:58',
       '30/09/2012 23:59'],
      dtype='object', name='Date', length=491589)

在这种情况下,csv文件看起来像:(原来它是一个我重新保存为CSV的文本文件):

TimeW_1min,CONC_1min
01/04/2012 00:00,17.9
01/04/2012 00:01,-1.2
01/04/2012 00:02,16.8

同时如果我使用原始的txt文件:我得到:

  

TypeError:仅对DatetimeIndex,TimedeltaIndex或   PeriodIndex,但得到了'Index'的实例

此时:df1.index看起来像:

Index([], dtype='object', name='Date')

但是当我使用另一个看起来像的数据集时:

01-mar-05 12:00,  22.7,  8.1, 0.0214, 1.3727, 0.0214, 1.6969, 1.00,30.603
01-mar-05 12:05, -11.7,  8.1, 0.0214, 1.3725, 0.0214, 1.6965, 1.00,30.5871

它不仅运行程序,df1.index看起来像:

DatetimeIndex(['2005-03-01 12:00:00', '2005-03-01 12:10:00',
               '2005-03-01 12:15:00', '2005-03-01 12:20:00',
etc.

 '2005-03-03 12:00:00'],
              dtype='datetime64[ns]', name='Date', freq=None)

那么如何将第一个转换为txt或csv文件,以读取为datetime64 [ns]格式。

非常感谢

这是一个指向原始文本文件的链接:我尝试使代码适用于:

http://expirebox.com/download/fe01dc85c38e9bf13d477508006d7c94.html

但这给出了一种奇怪的格式: 所以我进入了excel并将其保存为csv ..,可以在这里找到:

http://expirebox.com/download/b984ecf365c4c19387a650eeb17f008f.html

第二个是我想要使用的......但无济于事

将代码更改为: aethalometer=['Date','Conc'] df1=pd.read_csv('BC_2012_1min.txt', names=aethalometer, parse_dates=True,skiprows=1,sep='\t').set_index('Date') df1.index = df1.index.to_period('h')

现在打印出来:

2012/9/30 23:58:00 12.40 2012/9/30 23:59:00 2.60

但是说: AttributeError: 'Index' object has no attribute 'to_period

df1.index仍然是一个对象:

dtype='object', name='Date', length=491588)

尝试: df1.index = pd.to_datetime(df1.index)

但是这表示未知的字符串格式

1 个答案:

答案 0 :(得分:1)

好的,您的文件看起来已经被您创建它的任何方法所吸引,您在行上重复了标题:

43202,87843,132482,174243,186697,231338,274539,319180,363821,407022,448389

如下:

2012/4/30 23:59:00  -16.00
TimeW_1min  CONC_1min
2012/8/1 00:00:00   15.10

所以你可以做的是不尝试解析日期列并使用to_datetime转换为params errors='coerce',这会将错误的行转换为NaT然后你可以过滤行out并设置索引并根据需要转换为PeriodIndex

In [126]:
df = pd.read_csv(r'c:\data\BC_2012_1min.txt', sep='\t', names=['Date','Conc'], skiprows=1 )
df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
df = df[df['Date'].notnull()].set_index('Date').to_period('h')
df.index

Out[126]:
PeriodIndex(['2012-04-01 00:00', '2012-04-01 00:00', '2012-04-01 00:00',
             '2012-04-01 00:00', '2012-04-01 00:00', '2012-04-01 00:00',
             '2012-04-01 00:00', '2012-04-01 00:00', '2012-04-01 00:00',
             '2012-04-01 00:00',
             ...
             '2012-09-30 23:00', '2012-09-30 23:00', '2012-09-30 23:00',
             '2012-09-30 23:00', '2012-09-30 23:00', '2012-09-30 23:00',
             '2012-09-30 23:00', '2012-09-30 23:00', '2012-09-30 23:00',
             '2012-09-30 23:00'],
            dtype='int64', name='Date', length=491577, freq='H')

所以在你的情况下改变我的第一行:

aethalometer=['Date','Conc']
df1=pd.read_csv('BC_2012_1min.csv', names=aethalometer, sep='\t', skiprows=1)