当前位置: 首页 > 面试题库 >

熊猫:如何从“周”和“年”创建日期时间对象?

云弘壮
2023-03-14
问题内容

我有一个数据框,它提供两个整数列,分别是年份和年份:

import pandas as pd
import numpy as np
L1 = [43,44,51,2,5,12]
L2 = [2016,2016,2016,2017,2017,2017]
df = pd.DataFrame({"Week":L1,"Year":L2})

df
Out[72]: 
   Week  Year
0    43  2016
1    44  2016
2    51  2016
3     2  2017
4     5  2017
5    12  2017

我需要从这两个数字创建一个datetime-object。

我试过了,但是抛出一个错误:

df["DT"] = df.apply(lambda x: np.datetime64(x.Year,'Y') + np.timedelta64(x.Week,'W'),axis=1)

然后我尝试了一下,它可以工作,但是给出了错误的结果,那就是它完全忽略了一周:

df["S"] = df.Week.astype(str)+'-'+df.Year.astype(str)
df["DT"] = df["S"].apply(lambda x: pd.to_datetime(x,format='%W-%Y'))

df
Out[74]: 
   Week  Year        S         DT
0    43  2016  43-2016 2016-01-01
1    44  2016  44-2016 2016-01-01
2    51  2016  51-2016 2016-01-01
3     2  2017   2-2017 2017-01-01
4     5  2017   5-2017 2017-01-01
5    12  2017  12-2017 2017-01-01

我真的迷失在Python datetime,Numpydatetime64和Pandas之间Timestamp,您能告诉我它是如何正确完成的吗?

我正在使用Python 3,如果这在任何方面都有意义的话。

编辑:

从Python
3.8开始,可以使用针对datetime.date对象的新引入的方法轻松解决此问题:https
:
//docs.python.org/3/library/datetime.html#datetime.date.fromisocalendar


问题答案:

尝试这个:

In [19]: pd.to_datetime(df.Year.astype(str), format='%Y') + \
             pd.to_timedelta(df.Week.mul(7).astype(str) + ' days')
Out[19]:
0   2016-10-28
1   2016-11-04
2   2016-12-23
3   2017-01-15
4   2017-02-05
5   2017-03-26
dtype: datetime64[ns]

最初我有时间戳 s

从UNIX纪元时间戳解析它要容易得多:

df['Date'] = pd.to_datetime(df['UNIX_Time'], unit='s')

*10M行DF的 *计时

设定:

In [26]: df = pd.DataFrame(pd.date_range('1970-01-01', freq='1T', periods=10**7), columns=['date'])

In [27]: df.shape
Out[27]: (10000000, 1)

In [28]: df['unix_ts'] = df['date'].astype(np.int64)//10**9

In [30]: df
Out[30]:
                       date    unix_ts
0       1970-01-01 00:00:00          0
1       1970-01-01 00:01:00         60
2       1970-01-01 00:02:00        120
3       1970-01-01 00:03:00        180
4       1970-01-01 00:04:00        240
5       1970-01-01 00:05:00        300
6       1970-01-01 00:06:00        360
7       1970-01-01 00:07:00        420
8       1970-01-01 00:08:00        480
9       1970-01-01 00:09:00        540
...                     ...        ...
9999990 1989-01-05 10:30:00  599999400
9999991 1989-01-05 10:31:00  599999460
9999992 1989-01-05 10:32:00  599999520
9999993 1989-01-05 10:33:00  599999580
9999994 1989-01-05 10:34:00  599999640
9999995 1989-01-05 10:35:00  599999700
9999996 1989-01-05 10:36:00  599999760
9999997 1989-01-05 10:37:00  599999820
9999998 1989-01-05 10:38:00  599999880
9999999 1989-01-05 10:39:00  599999940

[10000000 rows x 2 columns]

检查:

In [31]: pd.to_datetime(df.unix_ts, unit='s')
Out[31]:
0         1970-01-01 00:00:00
1         1970-01-01 00:01:00
2         1970-01-01 00:02:00
3         1970-01-01 00:03:00
4         1970-01-01 00:04:00
5         1970-01-01 00:05:00
6         1970-01-01 00:06:00
7         1970-01-01 00:07:00
8         1970-01-01 00:08:00
9         1970-01-01 00:09:00
                  ...
9999990   1989-01-05 10:30:00
9999991   1989-01-05 10:31:00
9999992   1989-01-05 10:32:00
9999993   1989-01-05 10:33:00
9999994   1989-01-05 10:34:00
9999995   1989-01-05 10:35:00
9999996   1989-01-05 10:36:00
9999997   1989-01-05 10:37:00
9999998   1989-01-05 10:38:00
9999999   1989-01-05 10:39:00
Name: unix_ts, Length: 10000000, dtype: datetime64[ns]

定时:

In [32]: %timeit pd.to_datetime(df.unix_ts, unit='s')
10 loops, best of 3: 156 ms per loop

结论: 我认为156毫秒转换1000万行并不算慢



 类似资料:
  • 问题内容: 我有一个datetime列,如下所示- 现在,我想从此列的每一行中减去一年。我怎样才能达到相同的目标?我可以使用哪个库? 预期字段- 谢谢。 问题答案: 您可以用来实现以下目的:

  • 问题内容: 如何计算人的年龄(基于dob列),并使用新值将一列添加到数据框中? 数据框如下所示: 我尝试执行以下操作: 但是,收到以下错误: TypeError:-:“ datetime.datetime”和“ str”的不受支持的操作数类型 问题答案: 产量 看来您的栏目前是字串。首先,将它们转换为using 。 该格式将最后两位数字转换为年份,但不幸的是假设的平均值为2052。由于这可能不是希

  • 问题内容: 输出为: 1988年 1月25 日星期三00:00:08 IST 1989 我过去了,但我得到了。为什么? 问题答案: 日历中的月份从零开始。因此,将12解释为12月+ 1个月。用

  • 输出为: 1988 1989年1月25 00:00:08日星期三 我通过了1988年12月25日的考试,但我得到了1989年1月25日的考试。为什么?

  • 问题内容: 假设我有一个时间戳值的DataFrame : 我想创建一个新列。我可以通过编写一个简短的函数并使用它来迭代地创建它来创建它: 然后,我将看到以下结果: 什么我 想 实现的是这样一些较短的转变(我知道是错误的,但在精神得到): 显然,该列是类型的,因此没有这些属性,但是似乎有一种使用矩阵运算的简单方法。 有更直接的方法吗? 问题答案: 假设时间戳是数据帧的索引,则可以执行以下操作: 如果

  • 问题内容: 我有一个包含300k条带有日期的记录的变量,并且该日期看起来像是该日期的 2015-02-21 12:08:51 我想删除时间 日期变量的类型是pandas.core.series.series 这是我尝试的方式 一些随机错误 在上面的代码中,textdata是我的数据集名称,而vfreceived date是一个由日期组成的变量。 如何编写代码以从datetime中删除时间。 问题答