使用pandas操作csv数据

2 投票
2 回答
4462 浏览
提问于 2025-04-18 03:41

这里有一个关于pandas的数据问题。我想从一个csv文件中提取两列数据,然后对这些数据进行处理,最后再保存。

这个csv文件的内容是:

year    month
2007    1
2007    2
2007    3
2007    4
2008    1
2008    3

这是我现在的代码:

records = pd.read_csv(path)
frame = pd.DataFrame(records)
combined = datetime(frame['year'].astype(int), frame['month'].astype(int), 1)

出现的错误是:

TypeError: cannot convert the series to "<type 'int'>"

有什么想法吗?

2 个回答

0

我遇到过类似的问题,答案是你需要确保你的数据表中有年、月和日这几列:

df['Date'] = df[['Year', 'Month', 'Day']].apply(lambda s : datetime.datetime(*s),axis = 1)

第一部分是从数据表中选择年、月和日期这几列,第二部分则是对这些数据逐个应用日期时间的函数。

如果你的数据中没有日这一列,就像你的数据所示的那样,你可以这样做:

df['Day'] = 1

这样就可以把日的值填上了。这虽然不是最优的代码解决方案,但可以快速解决问题。如果你不想要这个日的列,之后可以随时把它删掉。

2

在处理 pandas 的数据列时,直接用 datetime 是不行的。你可以用 to_datetime 函数,或者在 apply 里使用 datetime。像下面这样应该就能正常工作:

In [9]: df
Out[9]: 
   year  month
0  2007      1
1  2007      2
2  2007      3
3  2007      4
4  2008      1
5  2008      3

In [10]: pd.to_datetime(df['year'].astype(str) + '-'
                     + df['month'].astype(str)
                     + '-1')
Out[10]: 
0   2007-01-01
1   2007-02-01
2   2007-03-01
3   2007-04-01
4   2008-01-01
5   2008-03-01
dtype: datetime64[ns]

或者你也可以使用 apply:

In [11]: df.apply(lambda x: datetime(x['year'],x['month'],1),axis=1)
Out[11]: 
0   2007-01-01
1   2007-02-01
2   2007-03-01
3   2007-04-01
4   2008-01-01
5   2008-03-01
dtype: datetime64[ns]

另一个补充:你也可以在用 read_csv 时处理大部分日期解析,但这样的话,你需要在读取数据后调整一下 day(注意,我的数据是放在一个叫 'data' 的字符串里):

In [12]: df = pd.read_csv(StringIO(data),header=True,                           
                          parse_dates={'date':['year','month']})
In [13]: df['date'] = df['date'].values.astype('datetime64[M]')                 
In [14]: df
Out[14]: 
        date
0 2007-01-01
1 2007-02-01
2 2007-03-01
3 2007-04-01
4 2008-01-01
5 2008-03-01

撰写回答