一个60万行的csv文件看起来是这样的。
<表类>
时间价值 tbody><<tr>2022-07-05 10:00:23 2 2022-07-05 10:01:11 5 2022-07-05 10:01:16 1 2022-07-05 10:01:33 2 2022-07-05 10:04:26 15 2022-07-05 10:05:57 1 2022-07-05 10:05:57 1 2022-07-05 10:05:57 3 表类>
您可以使用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