从 pandas Timestamp 获取 MM-DD-YYYY

Posted

技术标签:

【中文标题】从 pandas Timestamp 获取 MM-DD-YYYY【英文标题】:Get MM-DD-YYYY from pandas Timestamp 【发布时间】:2013-10-07 00:14:45 【问题描述】:

日期在 python 中似乎是一件棘手的事情,我在简单地从 pandas TimeStamp 中删除日期时遇到了很多麻烦。我想从2013-09-29 02:34:44 变成简单的09-29-2013

我有一个包含 Created_date 列的数据框:

Name: Created_Date, Length: 1162549, dtype: datetime64[ns]`

我已尝试在此系列上应用.date() 方法,例如:df.Created_Date.date(),但我收到错误AttributeError: 'Series' object has no attribute 'date'

谁能帮帮我?

【问题讨论】:

【参考方案1】:

我会这样做。

pdTime =pd.date_range(timeStamp, periods=len(years), freq="D")
pdTime[i].strftime('%m-%d-%Y')

【讨论】:

【参考方案2】:

您可以尝试在dataframedatetime64[ns] 上使用.dt.date

例如df['Created_date'] = df['Created_date'].dt.date

输入dataframe命名为test_df

print(test_df)

结果:

         Created_date
0     2015-03-04 15:39:16
1     2015-03-22 17:36:49
2     2015-03-25 22:08:45
3     2015-03-16 13:45:20
4     2015-03-19 18:53:50

检查dtypes:

print(test_df.dtypes)

结果:

Created_date    datetime64[ns]
dtype: object

提取date 并更新Created_date 列:

test_df['Created_date'] = test_df['Created_date'].dt.date
print(test_df)

结果:

  Created_date
0   2015-03-04
1   2015-03-22
2   2015-03-25
3   2015-03-16
4   2015-03-19

【讨论】:

【参考方案3】:

也许这是最近才出现的,但有内置的方法。试试:

In [27]: s = pd.Series(pd.date_range(pd.Timestamp('now'), periods=2))
In [28]: s
Out[28]: 
0   2016-02-11 19:11:43.386016
1   2016-02-12 19:11:43.386016
dtype: datetime64[ns]
In [29]: s.dt.to_pydatetime()
Out[29]: 
array([datetime.datetime(2016, 2, 11, 19, 11, 43, 386016),
   datetime.datetime(2016, 2, 12, 19, 11, 43, 386016)], dtype=object)

【讨论】:

【参考方案4】:

map 以上元素:

In [239]: from operator import methodcaller

In [240]: s = Series(date_range(Timestamp('now'), periods=2))

In [241]: s
Out[241]:
0   2013-10-01 00:24:16
1   2013-10-02 00:24:16
dtype: datetime64[ns]

In [238]: s.map(lambda x: x.strftime('%d-%m-%Y'))
Out[238]:
0    01-10-2013
1    02-10-2013
dtype: object

In [242]: s.map(methodcaller('strftime', '%d-%m-%Y'))
Out[242]:
0    01-10-2013
1    02-10-2013
dtype: object

您可以通过调用构成SeriesTimestamp 元素的date() 方法来获取原始datetime.date 对象:

In [249]: s.map(methodcaller('date'))

Out[249]:
0    2013-10-01
1    2013-10-02
dtype: object

In [250]: s.map(methodcaller('date')).values

Out[250]:
array([datetime.date(2013, 10, 1), datetime.date(2013, 10, 2)], dtype=object)

另一种方法是调用未绑定的Timestamp.date 方法:

In [273]: s.map(Timestamp.date)
Out[273]:
0    2013-10-01
1    2013-10-02
dtype: object

此方法最快,恕我直言,可读性最强。 Timestamp 可在*** pandas 模块中访问,如下所示:pandas.Timestamp。出于说明目的,我直接导入了它。

DatetimeIndex 对象的date 属性做类似的事情,但返回一个numpy 对象数组:

In [243]: index = DatetimeIndex(s)

In [244]: index
Out[244]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-10-01 00:24:16, 2013-10-02 00:24:16]
Length: 2, Freq: None, Timezone: None

In [246]: index.date
Out[246]:
array([datetime.date(2013, 10, 1), datetime.date(2013, 10, 2)], dtype=object)

对于较大的datetime64[ns] Series 对象,调用Timestamp.dateoperator.methodcaller 快,后者比lambda 稍快:

In [263]: f = methodcaller('date')

In [264]: flam = lambda x: x.date()

In [265]: fmeth = Timestamp.date

In [266]: s2 = Series(date_range('20010101', periods=1000000, freq='T'))

In [267]: s2
Out[267]:
0    2001-01-01 00:00:00
1    2001-01-01 00:01:00
2    2001-01-01 00:02:00
3    2001-01-01 00:03:00
4    2001-01-01 00:04:00
5    2001-01-01 00:05:00
6    2001-01-01 00:06:00
7    2001-01-01 00:07:00
8    2001-01-01 00:08:00
9    2001-01-01 00:09:00
10   2001-01-01 00:10:00
11   2001-01-01 00:11:00
12   2001-01-01 00:12:00
13   2001-01-01 00:13:00
14   2001-01-01 00:14:00
...
999985   2002-11-26 10:25:00
999986   2002-11-26 10:26:00
999987   2002-11-26 10:27:00
999988   2002-11-26 10:28:00
999989   2002-11-26 10:29:00
999990   2002-11-26 10:30:00
999991   2002-11-26 10:31:00
999992   2002-11-26 10:32:00
999993   2002-11-26 10:33:00
999994   2002-11-26 10:34:00
999995   2002-11-26 10:35:00
999996   2002-11-26 10:36:00
999997   2002-11-26 10:37:00
999998   2002-11-26 10:38:00
999999   2002-11-26 10:39:00
Length: 1000000, dtype: datetime64[ns]

In [269]: timeit s2.map(f)
1 loops, best of 3: 1.04 s per loop

In [270]: timeit s2.map(flam)
1 loops, best of 3: 1.1 s per loop

In [271]: timeit s2.map(fmeth)
1 loops, best of 3: 968 ms per loop

请记住,pandas 的目标之一是在numpy 之上提供一个层,以便(大多数时候)您不必处理@987654345 的低级细节@。因此,在数组中获取原始datetime.date 对象的用途有限,因为它们不对应于pandas 支持的任何numpy.dtypepandas 仅支持datetime64[ns] [那是纳秒] dtypes)。也就是说,有时您需要这样做。

【讨论】:

非常感谢您的全面回答! FWIW,我注意到s.map(methodcaller('date')) 似乎是这里给出的三个选项中最快的。 @blaklaybul 很高兴知道。我会放一些timeits。 @blaklaybul 我添加了另一种方法来使用未绑定的Timestamp.date 方法。这是最快的。 只为美丽:使用s=Series(date_range(Timestamp('now'), periods=2)) 的“s”创作少了一点打字 我相信@Phillip 的意图是创建一个大系列,以便他可以使用 ipython 的超时魔法测试他的每个方法的效率。

以上是关于从 pandas Timestamp 获取 MM-DD-YYYY的主要内容,如果未能解决你的问题,请参考以下文章

从 Timestamp 获取 datetime 对象(Python)

Hive - 如何从 Hive 获取最近几个月的数据?

JS如何处理后台获取的Timestamp?

Java如何获取ISO 8601时间

Pandas 将日期字符串从格式 mm/d/yyyy 和 mm/dd/yyyy 转换为 dd.mm.yyyy

pandas:从时间戳中提取日期和时间