【问题标题】:How to convert datetime into a float [duplicate]如何将日期时间转换为浮点数[重复]
【发布时间】:2019-12-19 20:21:27
【问题描述】:

我有一个包含两列时间戳的数据框,我想减去它们,以便得到小时和分钟的时差。

ColA    Timestamp           Timestamp2            
1   06:40:00              17:40:00     
2   06:29:00              16:29:00          
3   07:05:00              15:29:00  
4   06:43:00              18:55:00   

我尝试了以下代码,但它只给了我小时数(一个整数)。

for m in range(4):
    j = df.iloc[m,0]
    d1 = df.iloc[m,2]
    d2 = df.iloc[m,1]
    td = d1-d2
    q = td.total_seconds() / 3600
    print ("Timeinterval %s is %d hours." %(j, q))

我也用函数尝试过(它给了我一个元组,或者如果我忽略逗号后面的东西,我会得到与以前相同的结果):

def days_hours_minutes(td):
    return td.seconds//3600, (td.seconds//60)%60

还有,

def datetime_to_float(d):
    return d.timestamp()

抛出“'Timedelta' 对象没有属性 'timestamp'”。

两个时间戳之间的差异有效,但我希望输出为浮点数(例如:8.5 小时)。

【问题讨论】:

  • 你能跑df["Timestamp"].dtype吗?
  • td.total_seconds() / 3600 的结果是一个浮点数,但后面的print 输出的值是%d,是整数。

标签: python python-3.x dataframe datetime timedelta


【解决方案1】:

如果你的 Timestamp 是 object 类型,那么先这样做,否则直接跳到后面的部分:

df['Timestamp'] = pd.to_datetime(df['Timestamp'] )
df['Timestamp2'] = pd.to_datetime(df['Timestamp2'])

现在使用 dt 提取小时和分钟并将分钟列除以 60:

df['diff_h'] = (df['Timestamp2'].dt.hour - df['Timestamp'].dt.hour)
df['diff_m'] = (df['Timestamp2'].dt.minute - df['Timestamp'].dt.minute)
df['diff_m'] = round(df['diff_m']/60, 2)
df['final_diff'] = df['diff_h'].astype(float) + df['diff_m']

如果需要,请删除不必要的列:

del df['diff_h'], df['diff_m']

输出:

   ColA           Timestamp          Timestamp2  final_diff
0     1 2019-08-13 06:40:00 2019-08-13 17:40:00        11.0
1     2 2019-08-13 06:29:00 2019-08-13 16:29:00        10.0
2     3 2019-08-13 07:05:00 2019-08-13 15:29:00         8.4
3     4 2019-08-13 06:43:00 2019-08-13 18:55:00        12.2


PS:这种方法虽然更简单,但由于to_datetime 而带来了额外的日期(在本例中为今天 - 13-08-2019)。如果您想以原始格式保留时间戳,请将其存储在不同的列中,但我希望您了解大致的想法。

【讨论】:

  • 但是 8 小时 24 分钟不是 8.24 小时。另外,我尝试了您的代码,但在我更大的数据框中,它无法将“11.-33”之类的内容转换为浮点数。
  • Sihna,对不起,我们同时发表了评论。回答你的最后一个问题:是的,完全正确。两位数就够了。
  • 已更新。这应该可以解决问题:) 请检查。此外,对于较大的数据集,请避免使用循环。如果可能,请使用 dt 运算符。
  • 另外,11.-33 本来就是一个无效的数字。你的意思是-11.33?请张贴可能的特定行。
【解决方案2】:
q = td.total_seconds() / 3600
print ("Timeinterval %s is %d hours." %(j, q))

您应该更改这部分代码。

使用%d 只是格式化int,所以q 显示为int。

你应该改用%f

还有更多, 您最好使用以下显示变量值的方式。

print("Timeinterval {} is {} hours.".format(j, q))

【讨论】:

  • 无所谓总秒数
  • df['Timestamp'].total_seconds()没有被定义时,你可以尝试df['Timestamp'].dt.total_seconds()或者将df['Timestamp']转换成另一种格式来使用total_seconds()stackoverflow.com/questions/45884288/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2022-09-27
  • 2022-01-17
  • 2019-02-17
  • 1970-01-01
相关资源
最近更新 更多