标签: python-datetime

在 Python 中解析人类可读的重复日期

问题。在我的 Django 应用程序中,用户为计划执行创建任务。用户是非常非技术性的,如果他们能编写传统的人类可读的表达式来定义何时执行某些任务,那就太好了,例如:

  • 每逢星期一
  • 每周五、周三
  • 日常的
  • 每月 1、14、20 日
  • 每周五;每个月底

这是受Todoist 的启发。目前,只需要日期;没有时间。我花了几个小时在谷歌上搜索图书馆来做到这一点,但没有运气。我期待一个函数,比如说in_range(expression, date),这样:

>>> in_range('every monday, wednesday', date(2014, 4, 28))
True

>>> in_range('every end of month', date(2014, 5, 12))
False

>>> in_range('every millenium', date(2014, 5, 8))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: unknown token "millenium".
Run Code Online (Sandbox Code Playgroud)

变体。这就是我看过的。

  • 标准datetime库进行日期解析,但不进行上述日期范围解析。
  • Python-dateutil - 通过 支持重复日期rrule,非常实用,但仍然不支持解析。
  • Python-crontabPython-croniter接受标准的 Unix crontab 语法(并允许指定工作日等),但这种语法仍然过于技术性,如果可能,我想避免它。
  • ArrowParsedatetime不支持该功能。

那么,是否有我错过的 Python …

python django date python-datetime python-dateutil

5
推荐指数
1
解决办法
1563
查看次数

Python xmlrpclib 在传输时将 datetime 对象更改为 DateTime 实例

使用 Python 2.6.x 的 xmlrpclib 在客户端和服务器之间交换的消息在服务器端创建了一种“实例”类型,而不是“日期时间”类型。在客户端,我创建了一个新的

updateTime = datetime(year, month, day, hour, minute, second)
print type(updateTime)
print updateTime
Run Code Online (Sandbox Code Playgroud)

结果是

<type 'datetime.datetime'>
2015-10-07 10:21:52
Run Code Online (Sandbox Code Playgroud)

发送时,字典在客户端看起来像这样:

'updateTime': datetime.datetime(2015, 10, 7, 10, 21, 52)
Run Code Online (Sandbox Code Playgroud)

但是服务器端的传入字典是这样的:

'updateTime': <DateTime '20151007T10:21:52' at 7f4dbf4ceb90>
Run Code Online (Sandbox Code Playgroud)

打印类型及其字符串表示如下:

<type 'instance'>
20151007T10:21:52
Run Code Online (Sandbox Code Playgroud)

我们正在使用 xmlrpclib.ServerProxy 但将use_datetime更改为TrueFalse根本没有任何区别。

xmlrpclib.ServerProxy('https://'+rpc_server_addr, allow_none=True, use_datetime=True)
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我也希望接收方有一个 tpye 'datetime.datetime'。

python datetime xml-rpc xmlrpclib python-datetime

5
推荐指数
1
解决办法
1084
查看次数

熊猫计算每个日期过去 7 天的值

有两个数据框。首先是这样的:

print df1

        id        date    month  is_buy
     0  17  2015-01-16  2015-01       1
     1  17  2015-01-26  2015-01       1
     2  17  2015-01-27  2015-01       1
     3  17  2015-02-11  2015-02       1
     4  17  2015-03-14  2015-03       1
     5  18  2015-01-28  2015-01       1
     6  18  2015-02-12  2015-02       1
     7  18  2015-02-25  2015-02       1
     8  18  2015-03-04  2015-03       1
Run Code Online (Sandbox Code Playgroud)

在第二个数据框中,有一些来自第一个的按月汇总的数据:

df2 = df1[df1['is_buy'] == 1].groupby(['id', 'month']).agg({'is_buy': np.sum})

print df2

        id    month       buys
     0  17  2015-01          3
     1  17  2015-02          1
     2  17  2015-03          1
     3  18  2015-01 …
Run Code Online (Sandbox Code Playgroud)

python python-datetime pandas

5
推荐指数
1
解决办法
6597
查看次数

熊猫适用于属性而不是功能

是否可以使用 df.apply 来获取属性而不是运行函数?我想从日期中检索年份以执行 groupby。例如 ..

import pandas as pd
import datetime
import numpy as np

df = pd.DataFrame({'date': [datetime.datetime(2010,1,1)+datetime.timedelta(days=i*15) 
for i in range(0,100)]})
Run Code Online (Sandbox Code Playgroud)

这工作..

df['year'] = [d.year for d in df['date']]
Run Code Online (Sandbox Code Playgroud)

这也有效..

df['year'] = df['date'].apply(lambda x: x.year)
Run Code Online (Sandbox Code Playgroud)

但这不..

df['year'] = df['date'].apply(year)
Run Code Online (Sandbox Code Playgroud)

这也不..

df['year'] = df['date'].year
Run Code Online (Sandbox Code Playgroud)

这样做的最有效方法是什么?

python python-datetime pandas

5
推荐指数
1
解决办法
1326
查看次数

使用 pandas to_datetime 将秒转换为日期时间,而不降低微秒精度

我正在尝试使用 pandas to_datetime 将自纪元以来的秒数值(包括微秒精度)数组转换为日期时间格式,如下所示:

x = 1487187300.038075
time = pd.to_datetime(x, unit='s')
Run Code Online (Sandbox Code Playgroud)

这成功地转换为时间戳,但微秒精度下降(或至少不可见),产生:

Timestamp('2017-02-15 19:35:00')
Run Code Online (Sandbox Code Playgroud)

关于如何在不损失精度的情况下进行转换有什么建议吗?到目前为止,我的搜索都没有找到 OP 关心保持微秒精度的例子。

python-datetime pandas

5
推荐指数
1
解决办法
8034
查看次数

在 pandas 时间序列日期列表中查找该月的最大日期

我有一个没有每个日期的时间序列(即交易日期)。系列可以在这里复制。

 dates=pd.Series(np.random.randint(100,size=30),index=pd.to_datetime(['2010-01-04', '2010-01-05', '2010-01-06', '2010-01-07',
           '2010-01-08', '2010-01-11', '2010-01-12', '2010-01-13',
           '2010-01-14', '2010-01-15', '2010-01-19', '2010-01-20',
           '2010-01-21', '2010-01-22', '2010-01-25', '2010-01-26',
           '2010-01-27', '2010-01-28', '2010-01-29', '2010-02-01',
           '2010-02-02', '2010-02-03', '2010-02-04', '2010-02-05',
           '2010-02-08', '2010-02-09', '2010-02-10', '2010-02-11',
           '2010-02-12', '2010-02-16']))
Run Code Online (Sandbox Code Playgroud)

我想在我的日期列表中显示该月的最后一天,即:“2010-01-29”和“2010-02-16”

我查看了在Python的日期列表中获取每个月的最后一个日期

更具体地说...

import pandas as pd
import numpy as np

df = pd.read_csv('/path/to/file/')          # Load a dataframe with your file
df.index = df['my_date_field']              # set the dataframe index with your date
dfg = df.groupby(pd.TimeGrouper(freq='M'))  # group by month / alternatively use MS for Month Start / referencing …
Run Code Online (Sandbox Code Playgroud)

python-datetime pandas

5
推荐指数
1
解决办法
7123
查看次数

xarray:重塑数据,拆分维度

我有一个xarray具有以下维度的数据集:

Dimensions:      (subject: 30, session: 5, time: 45000)
Coordinates:
  * subject      (subject) object '110' '112' '114' '117' ...
  * session      (session) object 'week1' 'week2' 'week3' ...
  * time         (time) timedelta64[ns] 00:00:00 00:00:00.040000 ...
Run Code Online (Sandbox Code Playgroud)

我想将每个试验(主题/会话组合)分成更小的时间段,例如分成 3 个段,每个段有 15000 个值,结果维度可能如下所示:

(subject: 30, session: 5, segment: 3, time: 15000)
Run Code Online (Sandbox Code Playgroud)

我已经搜索并尝试了很多东西但都没有成功,这怎么办?

我一直在尝试的一件事似乎很接近,就是创建一个新的 MultiIndex 并将其拆开。

segment_data = np.repeat(range(3),len(ds.time)//3)
segment = xr.Variable(dims='time',data=segment_data)
newtime_data = np.tile(ds.time[:len(ds.time)//3],3)
newtime = xr.Variable(dims='time',data=newtime_data)
dsr = ds.assign_coords(segment=segment,newtime=newtime)
dsr = dsr.set_index(segment='segment',newtime='newtime')
dsr = dsr.stack(fragment=['segment','newtime'])
Run Code Online (Sandbox Code Playgroud)

然而,最后一行需要大量内存,并且似乎创建了一个维度fragment: len(ds.time)**2,这似乎不正确。我也不确定在这之后我必须做什么(unstack('fragment')?)。

编辑:更多的尝试让我来到这里: …

python python-datetime python-xarray

5
推荐指数
1
解决办法
2443
查看次数

获取类型错误:过滤数据帧时索引必须是 DatetimeIndex

我想按某个数据时间段过滤数据帧,如下代码所示。

df2 = df2['Dates'].between_time(pandas.to_datetime('5/13/2015 8:41'), pandas.to_datetime('5/13/2015 8:55'))[['Dates','Category']]
Run Code Online (Sandbox Code Playgroud)

但出现错误“TypeError:索引必须是 DatetimeIndex”这是数据帧

在此输入图像描述

我尝试过

df2 = pandas.read_csv(path2,parse_dates=[0])

就像其他帖子的回复之一一样,但仍然遇到相同的错误。有谁知道这里发生了什么?

python python-datetime pandas

5
推荐指数
1
解决办法
2万
查看次数

Pandas `.to_pydatetime()` 在 DataFrame 中不起作用

我有这样的字符串'03-21-2019',我想转换为本地 Python 日期时间对象:即datetime.datetime类型。转换很容易通过pandas

import pandas as pd
import datetime as dt

date_str = '03-21-2019'
pd_Timestamp = pd.to_datetime(date_str)
py_datetime_object = pd_Timestamp.to_pydatetime()
print(type(py_datetime_object))
Run Code Online (Sandbox Code Playgroud)

结果

<class 'datetime.datetime'>
Run Code Online (Sandbox Code Playgroud)

这正是我想要的,因为我想timedelta通过从另一个中减去其中一个来计算's - 在本机 Pythondatetime.datetime类中完美定义。但是,我的数据在pd.DataFrame. 当我尝试以下代码时:

import pandas as pd
import datetime as dt

df = pd.DataFrame(columns=['Date'])
df.loc[0] = ['03-21-2019']
df['Date'] = df['Date'].apply(lambda x:
                              pd.to_datetime(x).to_pydatetime())
print(type(df['Date'].iloc[0]))
Run Code Online (Sandbox Code Playgroud)

结果是

<class 'pandas._libs.tslibs.timestamps.Timestamp'>
Run Code Online (Sandbox Code Playgroud)

这是错误的类型,我一生都无法弄清楚为什么只有一部分lambda表达式被评估(即字符串到熊猫时间戳),而不是最后一部分(即熊猫-时间戳到日期时间。日期时间)。如果我显式定义函数,而不是使用lambda表达式,它也不起作用:

import pandas as pd
import datetime as dt


def …
Run Code Online (Sandbox Code Playgroud)

python-3.x python-datetime pandas

5
推荐指数
2
解决办法
2862
查看次数

使用日期逻辑创建假数据

我正在尝试将假数据插入到该表中。它不能完全随机,因为行需要有意义。下面我来解释一下。

我的数据如下所示:

帐号 帐户状态 开始日期 结束日期
C382861922 积极的 2016-05-25 没有任何
C382861922 不活动 没有任何 没有任何
C382861922 积极的 没有任何 没有任何
C382861922 不活动 没有任何 2021-12-31
C429768513 积极的 2015-12-27 没有任何
C429768513 不活动 没有任何 没有任何
C429768513 积极的 没有任何 没有任何
C429768513 不活动 没有任何 没有任何
C429768513 积极的 没有任何 没有任何
C429768513 不活动 没有任何 没有任何
C429768513 积极的 没有任何 没有任何
C429768513 不活动 没有任何 2021-12-31
C643625629 积极的 2016-07-24 没有任何
C643625629 不活动 没有任何 没有任何
C643625629 积极的 没有任何 2021-12-31
C82157435 积极的 2016-10-22 没有任何
C82157435 不活动 没有任何 2021-12-31

每个 AcctID 可以出现多次,但最容易解释我在做什么,仅举一个 AcctID 出现两次的例子:

帐号 …

python dataframe python-datetime pandas

5
推荐指数
1
解决办法
85
查看次数