Pandas DateFrame子集

时间:2017-07-07 07:02:08

标签: python pandas

我是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,没有秒。

3 个答案:

答案 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

...或temperaturetime的意思是:

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')