Python 将日期范围拆分为多个范围

Python 将日期范围拆分为多个范围,python,python-3.x,csv,datetime,Python,Python 3.x,Csv,Datetime,我有如下CSV格式的数据: 1940-10-01,somevalue 1940-11-02,somevalue 1940-11-03,somevalue 1940-11-04,somevalue 1940-12-05,somevalue 1940-12-06,somevalue 1941-01-07,somevalue 1941-02-08,somevalue 1941-03-09,somevalue 1941-05-01,somevalue 1941-06-02,somevalue 1941-

我有如下CSV格式的数据:

1940-10-01,somevalue
1940-11-02,somevalue
1940-11-03,somevalue
1940-11-04,somevalue
1940-12-05,somevalue
1940-12-06,somevalue
1941-01-07,somevalue
1941-02-08,somevalue
1941-03-09,somevalue
1941-05-01,somevalue
1941-06-02,somevalue
1941-07-03,somevalue
1941-10-04,somevalue
1941-12-05,somevalue
1941-12-06,somevalue
1942-01-07,somevalue
1942-02-08,somevalue
1942-03-09,somevalue
我想将所有数据的日期从
10月1日
明年3月31日
分开。因此,对于上述数据,输出将为:

1940/1941:

1940-11-02,somevalue
1940-11-03,somevalue
1940-11-04,somevalue
1940-12-05,somevalue
1940-12-06,somevalue
1941-01-07,somevalue
1941-02-08,somevalue
1941-03-09,somevalue
1941-10-04,somevalue
1941-12-05,somevalue
1941-12-06,somevalue
1942-01-07,somevalue
1942-02-08,somevalue
1942-03-09,somevalue
1942-10-01,somevalue
1941/1942:

1940-11-02,somevalue
1940-11-03,somevalue
1940-11-04,somevalue
1940-12-05,somevalue
1940-12-06,somevalue
1941-01-07,somevalue
1941-02-08,somevalue
1941-03-09,somevalue
1941-10-04,somevalue
1941-12-05,somevalue
1941-12-06,somevalue
1942-01-07,somevalue
1942-02-08,somevalue
1942-03-09,somevalue
1942-10-01,somevalue
我的代码跟踪是:

import csv
from datetime import datetime

with open('data.csv','r') as f:
    data = list(csv.reader(f))

quaters = []
year =  datetime.strptime(data[0][0], '%Y-%m-%d').year
for each in data:
    date =  datetime.strptime(each[0], '%Y-%m-%d')
    print(each)        

    if (date>=datetime(year=date.year,month=10,day=1) and date<=datetime(year=date.year+1,month=3,day=31)):
        middle_quaters[-1].append(each)
    if year != date.year:            
        quaters.append([])
导入csv
从日期时间导入日期时间
以open('data.csv','r')作为f:
数据=列表(csv.reader(f))
四分之一=[]
年份=datetime.strTime(数据[0][0],“%Y-%m-%d”)。年份
对于每个输入数据:
date=datetime.strTime(每个[0],“%Y-%m-%d”)
打印(每个)

如果(日期>=datetime(年=date.year,月=10,日=1)和日期我会使用
pandas数据框
来实现这一点。。 那会容易些。。 照此

那你的案子呢

data = pd.read_csv("data.csv")
df.loc[startDate : endDate]



# you can walk through a bunch of ranges like so..
listOfDateRanges = [(), (), ()]
for date_range in listOfDateRanges:
   df.loc[date_range[0] : date_range[1]]

为此,您可以使用
pandas
库。以下是相同的示例代码:

import pandas as pd
df = pd.read_csv('so.csv', parse_dates=['timestamp'])   #timestamp is your time column
current_year, next_year = 1940, 1941
df = df.query(f'(timestamp >= "{current_year}-10-01") & (timestamp <= "{next_year}-03-31")')
print (df)

希望这有帮助!

没有外部软件包…根据所选字段创建一个查找,然后对其进行整型,并执行小于等于大于的操作来建立范围

import re

data = '''1940-10-01,somevalue
1940-11-02,somevalue
1940-11-03,somevalue
1940-11-04,somevalue
1940-12-05,somevalue
1940-12-06,somevalue
1941-01-07,somevalue
1941-02-08,somevalue
1941-03-09,somevalue
1941-05-01,somevalue
1941-06-02,somevalue
1941-07-03,somevalue
1941-10-04,somevalue
1941-12-05,somevalue
1941-12-06,somevalue
1942-01-07,somevalue
1942-02-08,somevalue
1942-03-09,somevalue'''

lookup={}
lines = data.split('\n')
for line in lines:
    d = re.sub(r'-','',line.split(',')[0])
    lookup[d]=line

dates=sorted(lookup.keys())

_in=19401201
out=19411004
outfile=[]
for date in dates:
    if int(date) > _in and int(date) < out:
        outfile.append(lookup[date])

for l in outfile:
    print outfile

重新导入
数据=''1940-10-01,somevalue
1940-11-02,有些价值
1940-11-03,有点价值
1940-11-04,有点价值
1940-12-05,有点价值
1940-12-06,有些价值
1941-01-07,一些价值
1941-02-08,一些价值观
1941-03-09,有些价值
1941-05-01,有些价值
1941-06-02,有些价值
1941-07-03,有些价值
1941-10-04,一些价值观
1941-12-05,有点价值
1941-12-06,有点价值
1942-01-07,有些价值
1942-02-08,某个值
1942-03-09,某些值''
查找={}
lines=data.split('\n')
对于行中的行:
d=re.sub(r'-','',第行拆分(',')[0])
查找[d]=行
日期=已排序(lookup.keys())
_in=19401201
out=19411004
outfile=[]
对于日期中的日期:
如果int(日期)>输入和int(日期)<输出:
outfile.append(查找[日期])
对于输出文件中的l:
打印输出文件

但是我的日期范围在不断变化,就像它可以在任何年份一样,所以我不能硬编码它。你在哪里硬编码值?你的startDate和endDate可以是你想要的任何东西。将它们放在列表中..作为元组..并遍历范围以获得所需的日期..@Kaushal28你的意思是什么?你传递的基本上是一个过滤参数..是吗您的示例结果不是有错误吗?为什么1941/42的结果有1940年的记录?请用正确的输出查看我的答案。@Kaushal28我刚刚注意到,它是打字错误。文件中存储了什么输入?这不是一种优化方法,首先将
csv
转换为字符串,然后应用整数运算来确定日期时间范围。