【问题标题】:Python datetime transformPython 日期时间转换
【发布时间】:2015-04-20 22:42:27
【问题描述】:

我想将我的数据框中的列转换为 '12:51 AM' 到 '01'(等于 24 小时制时钟时间 '01:00')。是的,我想将它四舍五入到最接近的小时。

例如,假设我的 DataFrame 是:

Time
12:51 AM
1:51 AM
2:03 AM
4:23 PM

我想改成:

Time
01
02
02
16

我的方法:

首先,将每个字符串(例如“12:51 AM”)拆分为两部分 - “12:51”和“AM”。 然后,使用循环和 if 来实现这一点。

我正在寻找更有效的方法,例如使用 datetime 包。

非常感谢。

【问题讨论】:

    标签: python datetime pandas dataframe


    【解决方案1】:

    time.strptime() 符合您的需求。

    from time import strptime
    
    def transform(data_frame):
        time = strptime(data_frame, "%I:%M %p")
        hour = time.tm_hour
        if time.tm_min >= 30:
            if hour < 23:
                hour += 1
            else:
                hour = 0
        return hour
    
    values = "12:51 AM", "1:51 AM", "2:03 AM", "4:23 PM"
    
    for value in values:
        print(transform(value))
    

    输出:

    1
    2
    2
    16
    

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      现有答案没有任何问题,但他们没有使用任何可以使事情变得更容易的内置 pandas 解决方案。如果您从字符串格式的内容开始,您可以转换为日期时间,然后使用 pandas dt 提取小时数等。

      df['Time2'] = pd.to_datetime(df.Time)
      
             Time               Time2
      0  12:51 AM 2015-04-20 00:51:00
      1   1:51 AM 2015-04-20 01:51:00
      2   2:03 AM 2015-04-20 02:03:00
      3   4:23 PM 2015-04-20 16:23:00
      

      现在您可以提取小时/分钟/等。使用dt 方法非常容易。

      df['Time2'].dt.hour + df['Time2'].dt.minute.div(30).astype(int)
      
      0     1
      1     2
      2     2
      3    16
      

      有用的文档:

      dt accessor

      converting to timestamps

      【讨论】:

      • 哦,好的,谢谢@EdChum。这也很简单,我会添加它来回答。
      【解决方案3】:

      我同意 cdonts。这是一个pythonic解决方案

      from time import strptime as st
      
      times = "12:51 AM", "1:51 AM", "2:03 AM", "4:23 PM"
      for time in times:
          print(st(time, '%I:%M %p').tm_hour+st(time, '%I:%M %p').tm_min//30)
      

      根据您的需要,您可能希望将结果存储在列表(或您选择的数据类型)中

      times = [st(time, '%I:%M %p').tm_hour+st(time, '%I:%M %p').tm_min//30 for time in("12:51 AM", "1:51 AM", "2:03 AM", "4:23 PM")]
      

      目前尚不清楚您将从哪里开始。如果它们不是用户输入并且存储在某处以供以后检索,您可能需要编写一个函数来检索值并返回一个列表,然后可以像这样使用该列表

      times = [st(time, '%I:%M %p').tm_hour+st(time, '%I:%M %p').tm_min//30 for time in retrieve(args)]
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2016-01-27
        • 1970-01-01
        • 1970-01-01
        • 2015-08-19
        • 2020-06-15
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多