datetime datetime时区 - 在Python中将日期转换为日期时间



datetime菜鸟 time单位 (9)

愚蠢的问题,但有没有一种内置的方法在Python中将date转换为date ,即。 获取datetime的午夜date ? 相反的转换很简单 - datetime有一个.date()方法。 我真的必须手动调用datetime(d.year, d.month, d.day)吗?


Answers

从日期转换为日期时间的一种尚未提及的方法:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')

使用熊猫将一系列日期转换为Python日期时间:

dates = pd.DataFrame(
    {'date': pd.DatetimeIndex(start='2017-01-01', end='2017-01-5', freq='D')})
>>> dates
        date
0 2017-01-01
1 2017-01-02
2 2017-01-03
3 2017-01-04
4 2017-01-05

>>> pd.DatetimeIndex(dates['date']).to_pydatetime().tolist()
[datetime.datetime(2017, 1, 1, 0, 0),
 datetime.datetime(2017, 1, 2, 0, 0),
 datetime.datetime(2017, 1, 3, 0, 0),
 datetime.datetime(2017, 1, 4, 0, 0),
 datetime.datetime(2017, 1, 5, 0, 0)]

可能首先需要转换日期:

dates = pd.DataFrame(
        {'date': ['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05']})
dates['date'] = pd.DatetimeIndex(dates['date'])
pd.DatetimeIndex(dates['date']).to_pydatetime().tolist()

接受的答案是正确的,但我宁愿避免使用datetime.min.time()因为它对我来说并不明显。 如果这对你很明显,那么对你来说更多的权力。 对于timetuple方法和对排序的依赖,我也有同样的感受。

在我看来,在不依赖读者对datetime模块API非常熟悉的情况下,这样做的最明确可读的方法是:

from datetime import date, datetime
today = date.today()
today_with_time = datetime(
    year=today.year, 
    month=today.month,
    day=today.day,
)

这是我的“明确比隐含更好”。


我是Python的新手。 但是这个代码为我工作,它将我提供的指定输入转换为datetime。 这是代码。 如我错了请纠正我。

import sys
from datetime import datetime
from time import mktime, strptime

user_date = '02/15/1989'
if user_date is not None:
     user_date = datetime.strptime(user_date,"%m/%d/%Y")
else:
     user_date = datetime.now()
print user_date

如果你需要一些东西, datetime_object.date()会给你一个日期时间对象的日期。


有几种方法,尽管我确实相信你提到的(并且不喜欢)是最可读的。

>>> t=datetime.date.today()
>>> datetime.datetime.fromordinal(t.toordinal())
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(t.year, t.month, t.day)
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(*t.timetuple()[:-4])
datetime.datetime(2009, 12, 20, 0, 0)

等等 - 但基本上它们都依赖于从date对象中适当地提取信息,并将其放回适合的date的ctor或classfunction中。


你可以使用timetuple()方法和可变参数。

datetime.datetime(*(d.timetuple()[:6]))

今天是2016年,我认为最干净的解决方案是由熊猫时间戳提供的:

from datetime import date
import pandas as pd
d = date.today()
pd.Timestamp(d)

时间戳是与日期时间相当的熊猫,在大多数情况下可与其互换。 检查:

from datetime import datetime
isinstance(pd.Timestamp(d), datetime)

但如果你真的想要一个香草日期时间,你仍然可以这样做:

pd.Timestamp(d).to_datetime()

时间戳比日期时间更强大,在处理时区时也是如此。 实际上,时间戳功能非常强大,遗憾的是他们的记录太差了......


有关将子进程与调用进程分离的一些提示(在后台启动子进程)。

假设您想从CGI脚本启动一个长任务,即子进程应该比CGI脚本执行过程更长寿。

子流程模块docs的经典示例是:

import subprocess
import sys

# some code here

pid = subprocess.Popen([sys.executable, "longtask.py"]) # call subprocess

# some more code here

这里的想法是你不想在“调用子进程”行中等待,直到longtask.py完成。 但目前尚不清楚在这个例子中“更多代码”这一行之后会发生什么。

我的目标平台是freebsd,但是开发是在windows上进行的,所以我首先在windows上遇到了问题。

在Windows(win xp)上,父进程将不会完成,直到longtask.py完成其工作。 这不是你想要的CGI脚本。 问题不是Python特有的,在PHP社区中问题是一样的。

解决方案是将DETACHED_PROCESS 流程创建标志传递给win API中的底层CreateProcess函数。 如果你碰巧安装了pywin32,你可以从win32process模块​​导入标志,否则你应该自己定义:

DETACHED_PROCESS = 0x00000008

pid = subprocess.Popen([sys.executable, "longtask.py"],
                       creationflags=DETACHED_PROCESS).pid

/ * UPD 2015.10.27 @eryksun在下面的评论中指出,语义正确的标志是CREATE_NEW_CONSOLE(0x00000010)* /

在freebsd上我们还有另一个问题:父进程完成后,它也会完成子进程。 这也不是你想要的CGI脚本。 一些实验表明问题似乎在于共享sys.stdout。 工作解决方案如下:

pid = subprocess.Popen([sys.executable, "longtask.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

我没有检查其他平台上的代码,也不知道freebsd上的行为原因。 如果有人知道,请分享您的想法。 谷歌搜索在Python中启动后台进程尚未解决任何问题。





python datetime date