2016-02-29 63 views
0

我的数据框的时间由2个coloumns:dateHrMn,像这样:熊猫:如何阅读错误的时间数据?

enter image description here

我怎么能读他们进入的时间,绘制时间序列图? (还有其他值列,例如speed)。

我想我可以逃脱time.strptime('19900125'+'1200','%Y%m%d%H%M')

但问题是,从csv阅读时,HrMn0000将被解析为0,所以 time.strptime('19900125'+'0','%Y%m%d%H%M')将失败。

UPDATE:

我目前的做法:

# When reading the data, pase HrMn as string 
df = pd.read_csv(uipath,header=0, skipinitialspace=True, dtype={'HrMn': str}) 
df['time']=df.apply(lambda x:datetime.strptime("{0} {1}".format(x['date'],x['HrMn']), "%Y%m%d %H%M"),axis=1)# df.temp_date 
df.index= df['time'] 
# Then parse it again as int 
df['HrMn'] = df['HrMn'].astype(int) 
+0

我认为,如果你这样做只会工作:'DF = pd.read_csv(uipath,头= 0,skipinitialspace =真,parse_dates = [ '时间', 'HRMN'])' – EdChum

回答

2

您可以使用pd.to_datetime你已经把它改造成看起来像一个日期的字符串后:

def to_date_str(r): 
    d = r.date[: 4] + '-' + r.date[4: 6] + '-' + r.date[6: 8] 
    d += ' '+ r.HrMn[: 2] + ':' + r.HrMn[2: 4] 
    return d 

>>> pd.to_datetime(df[['date', 'HrMn']].apply(to_date_str, axis=1)) 
0 1990-01-25 12:00:00 
dtype: datetime64[ns] 

编辑

As @EdChu您可以更简单地做到这一点,因为

pd.to_datetime(df.date.astype(str) + df.HrMn) 

其中字符串 - 连接列。

+0

我'd连接列然后解析而不是调用'apply''pd.to_datetime(df ['date'] + df ['HrMn'])' – EdChum

+0

@EdChum超酷!我从来不会猜到'to_datetime'会对此产生影响。谢谢! –

+1

也可以调用'astype'而不是'map':'df ['date']。astype(str)'不确定是否更快,但这是'dtype'转换的首选方法 – EdChum

2

您可以直接在阅读的CSV,其中HrMn是补零为HHMM,解析日期即0值将代表00:00

df = pd.read_csv(
    uipath, 
    header=0, 
    skipinitialspace=True, 
    dtype={'HrMn': str}, 
    parse_dates={'datetime': ['date', 'HrMn']}, 
    date_parser=lambda x, y: pd.datetime.strptime('{0}{1:04.0f}'.format(x, int(y)), 
                '%Y%m%d%H%M'), 
    index_col='datetime' 
) 
0

我不明白你为什么把它叫做“病格式化“,这种格式实际上是相当普遍的,熊猫可以按原样解析它,只需指定要将哪些列解析为时间戳即可。

df = pd.read_csv(uipath, skipinitialspace=True, 
       parse_dates=[['date', 'HrMn']]) 
+0

It报告“['date''HrMn']不在索引中”,我不知道为什么? – cqcn1991

+0

好的细节取决于你确切的csv文件,我没有。根据您发布的代码,在我认为这应该起作用之前,请参阅我的编辑。但我没有什么可以测试的,所以不能确定。 – Goyo