4.7.2-时间间隔计算与转换.md

4.7.2 时间间隔计算与转换(问答库)

  1. 【单选题·易】pandas 用来表示时间间隔的对象是? A. Timestamp B. Timedelta C. DatetimeIndex D. DataFrame 答案:B 解析: 语料明确:pandas 使用 Timedelta 对象来表示时间间隔。Timestamp 表示时间点,相减后才得到 Timedelta。
  2. 【单选题·易】若有两个时间点,计算它们之间时间差的基本做法是? A. 只能调用 resample() B. 直接使用减法运算 C. 必须先写成字符串再拼接 D. 只能用 rolling() 答案:B 解析: 语料:如果有两个时间点,可以直接使用减法运算来计算它们之间的时间差,结果是一个 Timedelta 对象。
  3. 【判断题·易】两个 Timestamp 相减,结果是一个 Timedelta 对象。 答案:√ 解析: 课程示例 diff = end - start 后 type(diff) 为 Timedelta。两个日期 2024-08-01 08:00 与 2024-08-31 08:00 相减得到 Timedelta('30 days 00:00:00')。
  4. 【判断题·易】对整条时间序列调用 diff() 时,第一个元素是 0 天。 答案:× 解析: diff() 计算每个点与前一个的差,第一个位置没有前一项,结果为 NaT,不是 0,也不是普通的 NaN。
  5. 【多选题·中】下列属于课程中把时间间隔转换成特定单位时用到的方式的有: A. diff.days(获取时间差包含的天数) B. diff.seconds(除掉天数后剩余时间包含的秒数) C. diff.total_seconds()(返回时间差包含的总秒数) D. diff.resample('D')(按天重采样) 答案:ABC 解析: A、B、C 均为 4.7.2 转换部分的用法。resample() 属于 4.7.3 重采样,不是 Timedelta 的单位转换。
  6. 【单选题·中】执行下列代码后,diff 的结果是?
import pandas as pd
start = pd.Timestamp('2024-08-01 08:00')
end = pd.Timestamp('2024-08-31 08:00')
diff = end - start
print(diff)

A. Timedelta('0 days 00:00:00') B. Timedelta('30 days 00:00:00') C. Timedelta('31 days 00:00:00') D. Timestamp('2024-08-31 08:00') 答案:B 解析: 两个时刻均为 08:00,从 8 月 1 日到 8 月 31 日相隔 30 天,不是 31 天。结果类型是 Timedelta,不是 Timestamp。

  1. 【单选题·中】执行下列代码后,diff.seconds 的值是?
import pandas as pd
start = pd.Timestamp('2024-09-01 08:00:00')
end = pd.Timestamp('2024-09-03 09:10:10')
diff = end - start
print(diff.seconds)

A. 2 B. 4210 C. 177010.0 D. 86400 答案:B 解析: seconds 是除掉天数后剩余时间的秒数。间隔为 2 天 1 小时 10 分 10 秒,剩余秒数 = 1×3600+10×60+10 = 4210。A 是 days,C 是 total_seconds()。

  1. 【多选题·中】关于下列代码的输出,说法正确的有:
import pandas as pd
times = pd.Series(pd.date_range('2024-01-01', periods=5, freq='ME'))  # 课程写法为 freq='M'
diffs = times.diff()
print(diffs)

A. diffs 是一个序列,每个点与前一个的差 B. 索引 0 的值为 NaT C. 2024 年为闰年,1 月末到 2 月末相差 29 天 D. 五个相邻差都是 30 天 答案:ABC 解析: 语料输出为 NaT、29 days、31 days、30 days、31 days,对应月末实际天数,并非每月都按 30 天。freq='M' 在较新版本 pandas 中需写成 'ME',结果与课程一致。

  1. 【判断题·中】diff.seconds 返回时间差包含的总秒数。 答案:× 解析: seconds 只含除掉整天后的剩余秒。总秒数应调用 total_seconds()。课程示例中前者为 4210,后者为 177010.0。
  2. 【单选题·难】执行下列代码后,days、seconds、total_seconds() 三个结果依次是?
import pandas as pd
start = pd.Timestamp('2024-09-01 08:00:00')
end = pd.Timestamp('2024-09-03 09:10:10')
diff = end - start
print(diff.days, diff.seconds, diff.total_seconds())

A. 2、4210、177010.0 B. 2、177010、4210.0 C. 3、4210、177010.0 D. 2、70、172800.0 答案:A 解析: 间隔 = 2 天 + 1 小时 10 分 10 秒。days 取整天数 2;seconds = 4210;total_seconds() = 2×86400+4210 = 177010.0。B 把后两项对调;C 把日历跨日数当成 3;D 误把 1 小时 10 分当成 70 秒且漏掉剩余时间。

  1. 【简答题·中】说明 pandas 如何表示和计算时间间隔;再写出把 Timedelta 转换成天、剩余秒、总秒数的三种访问方式,并用课程示例中的数字说明三者含义有何不同。 答案: (1)pandas 用 Timedelta 表示时间间隔。两个时间点(Timestamp)直接相减即可得到 Timedelta;整条序列可用 diff() 计算每个点与前一个的差。 (2)diff.days:时间差包含的天数(整天分量)。 (3)diff.seconds:除掉天数后剩余时间包含的秒数,再据此可算小时和分钟。 (4)diff.total_seconds():函数调用,返回时间差包含的总秒数。 课程示例从 2024-09-01 08:00:00 到 2024-09-03 09:10:10:days 为 2,seconds 为 4210,total_seconds() 为 177010.0。三者不是同一量:前两个是拆开的分量,最后一个才是总长度。 解析: 评分要点:① Timedelta + 两点相减 / 序列 diff();② days、seconds、total_seconds() 三者职责写清;③ 课程数字 2 / 4210 / 177010.0 正确,并能指出 seconds 不是总秒数。
  2. 【简答题·难】结合下列代码,回答:(1)d1 为什么是 30 天而不是 31 天?(2)d2 第一个值为什么不是 0?后面四个间隔分别是多少、原因是什么?(3)d3.days、d3.seconds、d3.total_seconds() 各是多少?若要把剩余的 4210 秒换成时、分、秒,怎么算?
import pandas as pd
start = pd.Timestamp('2024-08-01 08:00')
end = pd.Timestamp('2024-08-31 08:00')
d1 = end - start

times = pd.Series(pd.date_range('2024-01-01', periods=5, freq='ME'))  # 课程写法为 freq='M'
d2 = times.diff()

t0 = pd.Timestamp('2024-09-01 08:00:00')
t1 = pd.Timestamp('2024-09-03 09:10:10')
d3 = t1 - t0
print(d1)
print(d2)
print(d3.days, d3.seconds, d3.total_seconds())

答案: (1)两个时刻都是 08:00,从 8 月 1 日计到 8 月 31 日是相隔 30 天,不是把 8 月的日历天数 31 当成间隔。 (2)diff() 是每个点减前一个点,第一项无前值,为 NaT。2024 年是闰年,月末序列为 1-31、2-29、3-31、4-30、5-31,相邻差为 29、31、30、31 天。 (3)days=2,seconds=4210,total_seconds()=177010.0。4210 = 1×3600 + 10×60 + 10,即剩余 1 小时 10 分 10 秒;总秒数 = 2×86400 + 4210。 解析: 评分要点:① 30 天来自时刻相减而非“八月有 31 天”;② 首项 NaT,四个间隔 29/31/30/31 且点出闰年 2 月;③ 三个转换值正确,并能由 4210 还原时分秒。

下载此文件