使用 Python 代码按日期提取数据并另存为单独的 csv 日期



我必须提取data dataise,并作为每个不同日期保存为单独的CSV:"时间"以这种格式(2018-03-26T16:09:10.024101278Z(在CSV文件的一列中给出。

此数据集在不同时间内采取了超过100K行。"我尝试制作数据框架"'''列名:(名称时间ID DDR版本读取(引用'''

dataset_CT= pd.read_csv("out_1.csv")
dataset_CT['Dates'] = pd.to_datetime(dataset_CT['time']).dt.date
dataset_CT['Time'] = pd.to_datetime(dataset_CT['time']).dt.time
dataset_CT.sort_values(by='Dates', axis=0, inplace=True)
dataset_CT.set_index(keys=['Dates'], drop=False,inplace=True)
Date_list=dataset_CT['Dates'].unique().tolist()

"得到这样的date_list([dateTime.date(2018,3,26(,dateTime.date(2018,3,31(]("

Date_set = dataset_CT.loc[dataset_CT.Dates=='(2018, 3, 26)']

我收到了如下

的空数据框
      name  time id ddr version readings Dates  Time
Dates

如何使用字符串比较?

Date_set = dataset_CT.loc[dataset_CT.Dates=='2018-03-26']

如果不起作用,请尝试更改Series.dt.date

dataset_CT['Dates'] = pd.to_datetime(dataset_CT['time']).dt.date
Date_set = dataset_CT.loc[dataset_CT.Dates=='2018-03-26']

to Series.dt.floor for note time:

dataset_CT['Dates'] = pd.to_datetime(dataset_CT['time']).dt.floor('d')
Date_set = dataset_CT.loc[dataset_CT.Dates=='2018-03-26']

使用默认参数读取输入时,我会假设您的分隔符和一个标头线的逗号( ,(。恕我直言,这里不需要。在时间上读取文件一行并将其写入与日期相对应的CSV文件是足够的。

警告:将标头添加到每个输出CSV文件中,并为每个新日期创建一个新的输出文件。具有自定义默认功能的collections.defaultdict足以满足这两个要求。

以下代码读取名为"out_1.csv"的输入CSV文件,并将其内容写入一堆名为 out_2018-03-26.csv的文件中的日期是输出文件中所有行的日期:

with open("out_1.csv") as fdin:
    def get_defaults():
        """returns a pair (csv_writer, file_object) for date dat initialized with header"""
        filename = 'out{}.csv'.format(dat)
        fd = open(filename, "w", newline='')
        fd.write(header)
        return (csv.writer(fd), fd)
    outfiles = collections.defaultdict(get_defaults)
    rd = csv.reader(fdin)
    header = next(fdin)             # store the header to later initialize output files
    for row in rd:
        dat = row[1][:10]           # extract the date
        wr = outfiles[dat][0]
        wr.writerow(row)            # and write the row to the appropriate output file
    # close the output files
    for i in outfiles:
        outfile[i][1].close()

第二次考虑之后,上面的代码可能会保留太多的打开文件。这是一个改进的版本,仅保留3个最近遇到的日期的打开文件(已测试(:

with open("out_1.csv") as fdin:
    cache = collections.deque()
    seen = set()
    def get_defaults():
        """returns a pair (csv_writer, file_object) for date dat initialized with header"""
        filename = 'out{}.csv'.format(dat)
        fd = open(filename, 'a' if dat in seen else 'w', newline='')
        if 0 == fd.tell():          # file is currently empty: write header
            fd.write(header)
        ret = (csv.writer(fd), fd)
        cache.append(dat)
        seen.add(dat)
        if len(cache) > 3:          # only keep 3 open files
            old = cache.popleft()
            print("Closing", old)
            outfiles[old][1].close()
            del outfiles[old]
        return ret
    outfiles = collections.defaultdict(get_defaults)
    rd = csv.reader(fdin)
    header = next(fdin)   # store the header to later initialize output files
    for row in rd:
        dat = row[1][:10] # extract the date
        wr = outfiles[dat][0]
        wr.writerow(row)  # and write the row to the appropriate output file
    # close the currently opened output files
    for i in outfiles:
        outfiles[i][1].close()

相关内容

最新更新