python - 时间读取为时间增量,前面有大量天数
问题描述
我正在处理过去一年左右的睡眠数据集。我已将 CSV 读入熊猫数据框。其中有一列名为'Duration'
. 我将其转换为 timeDelta 如下:
df.Duration = pd.to_timedelta(df.Duration)
df.Duration.head()
哪个输出
0 17711 days 08:27:00
1 17711 days 07:56:00
2 17711 days 04:22:00
3 17711 days 07:29:00
4 17711 days 06:46:00
Name: Duration, dtype: timedelta64[ns]
我有点理解为什么我会提前 17711 天,但我真正想要的只是时间。为了解决这个问题,我可以写
df.Duration = (df.Duration - pd.Timedelta('17711 days'))
这给了我
0 08:27:00
1 07:56:00
2 04:22:00
3 07:29:00
4 06:46:00
Name: Duration, dtype: timedelta64[ns]
然而,这是一个相当脆弱的方法。有没有更好的方法来获得我想要的时间?
解决方案
datetime.timdelta
对象将天、秒和微秒存储为属性。我们可以在pandas.DataFrame
with中访问它们dt
:
设置一些虚拟数据
import datetime as dt
import pandas as pd
df = pd.DataFrame(
data=(
dt.timedelta(days=17711, hours=i, minutes=i, seconds=i) for i in range(0, 10)
),
columns=['Duration']
)
print(df['Duration'])
Duration
0 17711 days 00:00:00
1 17711 days 01:01:01
2 17711 days 02:02:02
3 17711 days 03:03:03
4 17711 days 04:04:04
5 17711 days 05:05:05
6 17711 days 06:06:06
7 17711 days 07:07:07
8 17711 days 08:08:08
9 17711 days 09:09:09
Name: Duration, dtype: timedelta64[ns]
获取秒数并将其转换为小时
print(df['Duration'].dt.seconds / 3600)
0 0.000000
1 1.016944
2 2.033889
3 3.050833
4 4.067778
5 5.084722
6 6.101667
7 7.118611
8 8.135556
9 9.152500
Name: Duration, dtype: float64
只有几个小时
print(df['Duration'].dt.seconds // 3600)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
Name: Duration, dtype: int64
推荐阅读
- python - 在python中存储8皇后问题板的最佳方法是什么
- sql - 满足我条件的行的 datediff 每行仅一次
- typescript - 如何声明只有抽象类才能继承的基类?
- scikit-learn - sklearn Vectorizer(NLP 任务):生成自定义 NGram,能够按比例放大 n >= 3
- html - 在侧边栏导航 bootstrap4 中的链接之间放置空格
- api - mpv API:如何转到播放列表中的第 n 个元素?
- performance - 我在网页上插入了图像延迟,但 Google SpeedTest 告诉我考虑延迟加载屏幕外和隐藏图像
- java - JPA 中的 CURRENT_TIMESTAMP 使用数据库 postgres 在 Java 中获得什么位置?
- android - “必须指定有效的唤醒锁定级别”仅在 Pixel 2 XL (API 22) 上引发
- ios - 在ios swift中使用autolayot根据html文本更改webview高度