我有csv文件,其中每一行都是这种格式:
(moon_phase)\t(year) (month) (day) (time)
例如:
new moon\t2011 Jan 04 09:03
first quarter\t2011 Jan 12 11:31
我想用熊猫' read_csv()打开文件并提出如下表:
|moon_phase |date |time |
|--------------|-----------|-----|
|new moon |2011 Jan 04|09:03|
|first quarter |2011 Jan 12|11:31|
然而,当我使用带有值sep
的read_csv参数"\t|(?:\d)( )(?:\d)"
来分割制表空间中的行(以分隔月相和日期)和使用非捕获的正则表达式时组(分隔日期和时间),结果改为:
|New Moon |NaN|2011 Jan 0| |9:03|
|First Quarter|NaN|2011 Jan 1| |1:31|
我想使用月份的day
和匹配中的hour
,但分隔符应仅在分隔日期和时间时引用它们之间的空格。如何在正则表达式中完成?
答案 0 :(得分:1)
也许您可以在read_csv
中使用分隔符\t
,然后使用strftime
创建新列Date
和Time
:
import pandas as pd
import numpy as np
import io
temp=u"""new moon\t2011 Jan 04 09:03
first quarter\t2011 Jan 12 11:31"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp),
sep="\t",
parse_dates=[1],
header=None,
names=['Text', 'Datetime'] )
print df
Text Datetime
0 new moon 2011-01-04 09:03:00
1 first quarter 2011-01-12 11:31:00
df['Date'] = df['Datetime'].dt.strftime('%Y %b %d')
df['Time'] = df['Datetime'].dt.strftime('%H:%M')
#if you want drop column Datetime
df = df.drop('Datetime', axis=1)
print df
Text Date Time
0 new moon 2011 Jan 04 09:03
1 first quarter 2011 Jan 12 11:31