【问题标题】:Pandas average timestamp for DateFrame subsetDataFrame 子集的 Pandas 平均时间戳
【发布时间】:2020-06-29 21:15:29
【问题描述】:

我真的是熊猫新手,我有一个问题如何计算一组时间的平均值。

我有一个包含以下列的 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

非常感谢

西乔

编辑:

时间的原始 csv 文件格式为 hh:mm,不包含秒数。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为您可以使用timedelatas by to_timedelta,然后转换为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
    

    ...或temperaturetimes 的平均值:

    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
    

    【讨论】:

    • 感谢您的回答,但我收到此错误:TypeError: object of type 'datetime.time' has no len() 在处理上述异常期间,发生另一个异常:ValueError: Invalid type for timedelta标量:
    • 您不能转换为时间而不是日期时间,因为列日期在 read_csv 中由parse_date 参数转换。而typetime 列需要字符串。我添加回答read_csv。需要删除df["Date"] = pd.to_datetime(df["Date"]) df["Time"] = pd.to_datetime(df["Time"]).dt.time
    • 是的,对不起,我后来看到了你的其他答案。问题是csv文件没有秒的格式是:hh:mm,而我运行的时候想要的格式是hh:mm:ss 有没有办法避免呢?
    • 那么需要df['td']= pd.to_timedelta(df["Time"] + ':00').values.astype(np.int64)
    • 非常感谢!你的答案很完美!
    【解决方案2】:

    要取平均时间,您可以将时间序列转换为 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
    

    【讨论】:

    • 你用的是什么熊猫版本?
    • @jezrael 它的 0.19.1 和 python 版本 3.4.3。安装最新版本 0.20.1。
    • 对我来说 0.20.2 它不起作用...我使用 windows 而你?
    • @jezrael,刚刚将我的 pandas 包更新到 0.20.2,它仍然可以使用。顺便说一句,我正在使用 ubuntu。
    【解决方案3】:

    准备一个示例数据框(代表您的子集):

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

    【讨论】:

      猜你喜欢
      • 2018-07-21
      • 1970-01-01
      • 2012-08-13
      • 2018-09-04
      • 2023-03-10
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多