Python pandas按时间对csv中的列进行排序,间隔为5分钟,不舍入和求和



一个60万行的csv文件看起来是这样的。

<表类> 时间价值tbody><<tr>2022-07-05 10:00:2322022-07-05 10:01:1152022-07-05 10:01:1612022-07-05 10:01:3322022-07-05 10:04:26152022-07-05 10:05:5712022-07-05 10:05:5712022-07-05 10:05:573

您可以使用dt.ceil()函数舍入到下一个5分钟间隔,然后使用groupby对匹配行求和:

import pandas as pd

df = pd.read_csv('input.csv',  usecols=["Time", 'value'], parse_dates=[0])
df['Ceil'] = df['Time'].dt.ceil("5T", 0)
print(df.groupby('Ceil').agg('sum'))

给你:

value
Ceil                      
2022-07-05 10:05:00     25
2022-07-05 10:10:00      5

使用parse_dates参数可以自动将Time字段转换为datetime对象。

先回顾一下代码

def V_t_5_Min():
df = pd.DataFrame(pd.read_csv(Ex_Csv,  usecols = ["Time", 'value']))
a = df['Time'] = pd.to_datetime(df['Time'])
b = df['value']
c = pd.Series(a).dt.round("5T", 0)
df = pd.DataFrame(c)
df['value'] = b
c = df.groupby('Time')
df1 = pd.DataFrame(c.sum())
df1.to_csv('DatasetsCSVV_5_min.csv')

你可以试着做的-玩弄custom_round以达到所需的舍入。

def custom_round(x):
if x.minute % 10 == 5:
# deal with the 10:05:xx case
x = x.replace(minute=x.minute - 1)
x = x.ceil('5T')
return x

# data = [[e.strip() for e in line.split('|') if e.strip()]for line in data_.split("n") if '---' not in line]
# df_ = pd.DataFrame(data[1:], columns = data[0])
df_ = pd.DataFrame(pd.read_csv(Ex_Csv,  usecols = ["Time", 'value']))
df_['Time'] = df_['Time'].apply(pd.to_datetime)
df_['rounded_time'] = df_['Time'].apply(custom_round)
df_

这是在数据

上运行代码的结果。
Time    value   rounded_time
0   2022-07-05 10:00:23 2   2022-07-05 10:05:00
1   2022-07-05 10:01:11 5   2022-07-05 10:05:00
2   2022-07-05 10:01:16 1   2022-07-05 10:05:00
3   2022-07-05 10:01:33 2   2022-07-05 10:05:00
4   2022-07-05 10:04:26 15  2022-07-05 10:05:00
5   2022-07-05 10:05:57 1   2022-07-05 10:05:00
6   2022-07-05 10:05:57 1   2022-07-05 10:05:00
7   2022-07-05 10:05:57 3   2022-07-05 10:05:00