【问题标题】:Splitting a CSV file by range of datetimes按日期时间范围拆分 CSV 文件
【发布时间】:2023-03-08 16:41:01
【问题描述】:

我有一个相当大的 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]

【问题讨论】:

  • 搜索如何从 DateTime 字段中提取年月。已经有大约一百万个重复了。
  • 几乎完全相同的副本:stackoverflow.com/questions/17937049/…
  • 谢谢。抱歉重复的问题。不知道该如何表达这个问题。

标签: python datetime csv pandas


【解决方案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

pd.TimeGrouper

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

【讨论】:

    【解决方案2】:

    试试df.groupby((df.datetime.year, df.datetime.month))。这假设您要按年-月对分组,而不仅仅是将每年 9 月归为一类,例如

    【讨论】:

      【解决方案3】:

      如果文件非常大,您可能不想将整个文件放入数据库或列表中。您可以改为这样做。

      在这个例子中,我使用了一个非常简单的正则表达式来解析日期。有更适合此目的的正则表达式,但这应该适合您。

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 2019-04-17
        • 1970-01-01
        相关资源
        最近更新 更多