我是Pandas的新手,我有一个问题,如何计算一组时间的平均值。
我有一个包含列的csv文件:日期,时间,室外温度
我导入并修改为:
df = pd.read_csv("./file.csv", parse_dates=[0], dayfirst=True)
df["Date"] = pd.to_datetime(df["Date"])
df["Time"] = pd.to_datetime(df["Time"]).dt.time
我更喜欢将日期和时间分成两个不同的列,而不是将它们用作索引。
我已经提取了我需要的部分并获得了类似的东西:
Date Time Outside Temperature
4343 2006-06-30 13:00:00 15.9
4344 2006-06-30 13:10:00 15.9
4345 2006-06-30 13:20:00 15.9
4346 2006-06-30 13:30:00 15.9
4347 2006-06-30 13:40:00 15.9
你可以在相同的温度下看到我有不同的时间,我想有时间的平均值,如:13:22:34
我该怎么做?
我检查了其他问题:Average time for datetime list,我尝试了几种方式来访问时间,例如:
print(tempdf["Time"].dt.hour)
但我得到错误:
AttributeError: Can only use .dt accessor with datetimelike values
我认为我在转换为时间戳方面犯了一个错误。
你有什么建议吗?
我使用的是python3.5和pandas 0.20.2
非常感谢
Ciccio
修改
当时的原始csv文件格式为hh:mm,没有秒。
答案 0 :(得分:1)
我认为您可以to_timedelta
使用timedelata
,然后转换为ns
,获取mean
并转换回来:
df = pd.read_csv("./file.csv", parse_dates=[0], dayfirst=True)
a = pd.to_timedelta(df["Time"] + ':00').mean()
print (a)
0 days 13:20:00
a = pd.to_timedelta(pd.to_timedelta(df["Time"] + ':00').values.astype(np.int64).mean())
print (a)
0 days 13:20:00
如果需要每个独特日期的平均时间:
df['td']= pd.to_timedelta(df["Time"] + ':00').values.astype(np.int64)
df1 = pd.to_timedelta(df.groupby('Date')['td'].mean()).reset_index()
print (df1)
Date td
0 2006-06-30 13:20:00
......或者对于独特的温度:
df['td']= pd.to_timedelta(df["Time"] + ':00').values.astype(np.int64)
df1 = pd.to_timedelta(df.groupby('Outside Temperature')['td'].mean()).reset_index()
print (df1)
Outside Temperature td
0 15.9 13:20:00
...或temperature
和time
的意思是:
df['Time']= pd.to_timedelta(df["Time"]).values.astype(np.int64)
df1 = df.groupby('Date', as_index=False).mean()
df1['Time']= pd.to_timedelta(df1["Time"])
print (df1)
Date Time Outside Temperature
0 2006-06-30 13:20:00 15.9
答案 1 :(得分:0)
采用时间平均值将时间序列转换为timedelta类型并取平均值。要获得特定日期的平均时间和温度,请使用groupby
如果时间列仅包含hh:mm 你需要在其中添加秒
df['Time'] = pd.to_timedelta(df["Time"] + ':00')
print(df)
输出:
Date Time Outside Temperature
0 2006-06-30 13:00:00 15.9
1 2006-06-30 13:10:00 15.9
2 2006-06-30 13:20:00 15.9
3 2006-06-30 13:30:00 15.9
4 2006-06-30 13:40:00 15.9
将Time转换为int,以便可以在groupby中使用
df['Time'] = df['Time'].astype(int)
按日期列分组,获取时间和室外温度的平均值
df = df.groupby(['Date'])['Time', 'Outside Temperature'].mean()
现在再次将时间序列转换为Timedelta类型
df['Time'] = pd.to_timedelta(df['Time'])
输出:
Time Outside Temperature
Date
2006-06-30 13:20:00 15.9
答案 2 :(得分:0)
准备示例数据框(代表您的子集):
# Initiate dataframe
date_var = "date"
df = pd.DataFrame(data=[['A', '2018-08-05 17:06:01'],
['A', '2018-08-05 17:06:02'],
['A', '2018-08-05 17:06:03'],
['B', '2018-08-05 17:06:07'],
['B', '2018-08-05 17:06:09'],
['B', '2018-08-05 17:06:11']],
columns=['column', date_var])
# Convert date-column to proper pandas Datetime-values/pd.Timestamps
df[date_var] = pd.to_datetime(df[date_var])
提取所需的平均时间戳值:
# Extract the numeric value associated to each timestamp (epoch time)
# NOTE: this is being accomplished via accessing the .value - attribute of each Timestamp in the column
In:
[tsp.value for tsp in df[date_var]]
Out:
[
1533488761000000000, 1533488762000000000, 1533488763000000000,
1533488767000000000, 1533488769000000000, 1533488771000000000
]
# Use this to calculate the mean, then convert the result back to a timestamp
In:
pd.Timestamp(np.nanmean([tsp.value for tsp in df[date_var]]))
Out:
Timestamp('2018-08-05 17:06:05.500000')