我有一个非常大的CSV文件,其中包含2009-2015的数据。我想知道是否有一种简单的方法可以按月将此文件拆分为较小的文件。我可以将数据拆分成大小均匀的块,但我更愿意按月对数据进行分组。
DateTime Price Bid Ask Size
2009-09-28 09:30:17 35.5250 35.49 35.56 100
2009-09-28 09:30:18 35.5600 35.49 35.56 100
2009-09-28 09:30:18 35.5600 35.50 35.57 100
2009-09-28 09:30:20 35.5000 35.42 35.56 100
2009-09-28 09:30:20 35.5000 35.42 35.56 100
2009-09-28 09:30:30 35.4600 35.46 35.52 100
2009-09-28 09:30:30 35.4600 35.46 35.52 100
2009-09-28 09:30:30 35.5000 35.46 35.52 100
2009-09-28 09:30:33 35.5100 35.47 35.51 100
2009-09-28 09:30:40 35.5100 35.48 35.51 200
2009-09-28 09:30:41 35.5100 35.48 35.51 100
2009-09-28 09:30:42 35.4803 35.48 35.51 100
2009-09-28 09:30:42 35.4800 35.48 35.51 1044
... ... ... ... ...
2015-04-07 15:59:59 94.1200 94.10 94.12 100
2015-04-07 16:00:00 94.2000 94.09 94.60 300
2015-04-07 16:00:00 94.2100 94.09 94.60 100
2015-04-07 16:00:00 94.1800 94.09 94.60 217
2015-04-07 16:00:05 94.1100 94.09 94.59 600
2015-04-07 16:00:09 94.1100 94.09 94.59 350
2015-04-07 16:00:32 94.1100 94.09 94.59 2804
2015-04-07 16:00:32 94.1100 94.09 94.59 1582
2015-04-07 16:00:32 94.1100 94.09 94.59 100
2015-04-07 16:00:33 94.1100 94.09 94.59 600
2015-04-07 16:00:35 94.1100 94.09 94.59 16702
[29195283 rows x 5 columns]
答案 0 :(得分:1)
In [1599]: y.head()
Out[1599]:
Price Bid Ask Size
DateTime
2009-09-28 09:30:17 35.5250 35.49 35.56 100
2009-09-28 09:30:18 35.5600 35.49 35.56 100
2009-09-28 09:30:18 35.5600 35.50 35.57 100
2009-09-28 09:30:20 35.5000 35.42 35.56 100
2009-09-28 09:30:20 35.5000 35.42 35.56 100
如果您想按月或按年分组,可以使用以下方式进行分组:
pd.groupby(y, by=[y.index.year])
按月:
In [1597]: pd.groupby(y, by=[y.index.month]).count()
Out[1597]:
Price Bid Ask Size
4 11 11 11 11
5 1 1 1 0
9 13 13 13 13
按年份:
In [1598]: pd.groupby(y, by=[y.index.year]).count()
Out[1598]:
Price Bid Ask Size
2009 13 13 13 13
2015 12 12 12 11
In [1604]: y.groupby(pd.TimeGrouper(freq='M')).count().head()
Out[1604]:
Price Bid Ask Size
DateTime
2009-09-30 13 13 13 13
2009-10-31 0 0 0 0
2009-11-30 0 0 0 0
2009-12-31 0 0 0 0
2010-01-31 0 0 0 0
In [1605]: y.groupby(pd.TimeGrouper(freq='D')).count().head()
Out[1605]:
Price Bid Ask Size
DateTime
2009-09-28 13 13 13 13
2009-09-29 0 0 0 0
2009-09-30 0 0 0 0
2009-10-01 0 0 0 0
2009-10-02 0 0 0 0
答案 1 :(得分:0)
试试df.groupby((df.datetime.year, df.datetime.month))
。这假设您希望按年 - 月对进行分组,而不是仅将每个9月组合在一起,例如
答案 2 :(得分:0)
如果文件非常大,您可能不希望将整个文件放入数据库或列表中。你可以这样做。
在这个例子中,我使用一个非常简单的正则表达式来解析日期。为此目的有更合适的正则表达式,但这应该适合你。
import re
fileroot = 'blah'
with open(yourfile, 'r') as infile:
for line in infile:
datestr = re.match('\d{4}-\d\d-\d\d', line)
if datestr:
with open('{0}_{1}.txt'.format(fileroot, datestr.group(0)), 'a') as fil:
fil.write(line)